#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.