LINQ для объектов не распознает метод ‘System.Object get_Item(System.Метод String)’

#c# #asp.net #linq-to-entities

#c# #asp.net #linq-to-entities

Вопрос:

При попытке вывода данных в представление я получаю следующую ошибку. LINQ для объектов не распознает метод ‘System.Object get_Item(System.String)’, и этот метод не может быть преобразован в выражение хранилища.

Код контроллера:

 public ActionResult Index()
            {
                return View(ReturnResults());
            }

public IQueryable<ShippingRequest> ReturnResults()
        {
            RatesModel db = new RatesModel();

            IQueryable<ShippingRequest> response = db.ShippingRequests;

            var results = response
                .Where(r => r.UserId == (int)Session["UserId"]);

            return results;
        }
  

Просмотр кода:

 @model IEnumerable<ShippingRatesApp.Models.ShippingRequest>

@{
    ViewBag.Title = "Get Rates";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h3>Shipping Rates</h3>
@{ 
<table>
    @foreach (var rate in Model)
    {
        <tr>
            <td>@rate.ShipRate</td>
        </tr>
    }
</table>
}
  

Я очень новичок в c #, и ни один из поисковых запросов в Интернете, с которыми я сталкивался, не решил мою проблему. Может кто-нибудь, пожалуйста, помочь мне разобраться в этом? Спасибо!

Ответ №1:

Это означает, что он не может преобразовать Session["UserId"] в SQL (он недостаточно умен, чтобы извлекать значение из коллекции). Я бы рекомендовал сохранить это в значении перед его использованием:

 var currentUserId = (int)Session["UserId"];
var results = response
            .Where(r => r.UserId == currentUserId);
  

Комментарии:

1. Это будет справедливо для любого выражения, которое не может быть переведено в SQL. Инструкции LINQ обычно должны состоять в основном из синтаксиса LINQ и постоянных значений, помимо использования SqlFunctions помощников и нескольких других вещей. Просто кое-что, о чем следует помнить.

2. Взгляните на learn.microsoft.com/en-us/dotnet/framework/data/adonet/ef / … и некоторые из родственных статей, чтобы увидеть, как это сделать. NET преобразует вызовы определенных методов в различные инструкции SQL.