Я получаю это исключение:
Указанный член типа Paid не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, члены сущности и свойства навигации сущности.
public ActionResult Index()
{
var debts = storeDB.Orders
.Where(o => o.Paid == false)
.OrderByDescending(o => o.DateCreated);
return View(debts);
}
Мой класс модели
public partial class Order
{
public bool Paid {
get {
return TotalPaid >= Total;
}
}
public decimal TotalPaid {
get {
return Payments.Sum(p => p.Amount);
}
}
Платежи - это связанная таблица, содержащая сумму поля. Запрос работает, если я удалю предложение Where, показывающее правильную информацию о платежах, есть ли подсказка, что не так с кодом?
Решено, как предложенный ответ:
public ActionResult Index()
{
var debts = storeDB.Orders
.OrderByDescending(o => o.DateCreated)
.ToList()
.Where(o => o.Paid == false);
return View(debts);
}
linq
entity-framework
Марк
источник
источник
Ответы:
Entity пытается преобразовать ваше свойство Paid в SQL и не может, потому что оно не является частью схемы таблицы.
Что вы можете сделать, так это позволить Entity запросить таблицу без платного фильтра, а затем отфильтровать неплатные.
Это, конечно, означает, что вы возвращаете все данные на веб-сервер и фильтруете данные на нем. Если вы хотите выполнить фильтрацию на сервере БД, вы можете создать вычисляемый столбец в таблице или использовать хранимую процедуру.
источник
Просто пришлось решать аналогичную проблему. Приведенные выше решения требуют обработки в памяти, что является плохой практикой (отложенная загрузка).
Мое решение заключалось в том, чтобы написать помощника, возвращающего предикат:
Вы можете переписать свой оператор linq как:
Это удобно, когда вы хотите повторно использовать логику расчета (СУХОЙ). Обратной стороной является то, что логика отсутствует в вашей модели предметной области.
источник
Expression<Func<xx,yy>>
. Я когда-либо понимал это раньше, но теперь это кажется очевидным.Эта проблема также может возникать из-за
[NotMapped]
свойства, имеющего то же имя в вашей модели БД и модели представления.AutoMapper пытается выбрать его из БД во время проецирования; и свойство NotMapped, очевидно, не существует в БД.
Решением является
Ignore
свойство в конфигурации AutoMapper при сопоставлении модели БД с моделью представления.[NotMapped]
свойство с именемFoo
в вашей модели БД.Foo
в вашей модели представления..ForMember(a => a.Foo, b => b.Ignore());
источник
Теперь это преобразование происходит только для членов сущностей, инициализаторов и свойств навигации сущностей. Итак, чтобы выполнить функцию или получить сравнение свойств, нам нужно сначала преобразовать их в список в памяти, а затем применить функцию для получения данных.
Поэтому в целом
источник
Другая вероятная причина заключается в том, что вы используете
IEnumerable
для своей собственности, а неICollection
Так что вместо:
Сделай это:
А ты здоровяк, дори ... глупо терять два часа.
источник
Эта ситуация также может произойти, если вы используете неподдерживаемые EntityFramework типы , такие как unsigned int.
Это был мой случай такой ошибки.
Ознакомьтесь с дополнительной информацией о поддерживаемых типах: https://msdn.microsoft.com/en-us/library/ee382832(v=vs.100).aspx
GFoley83 объясняет, как можно обойти такие ситуации: как использовать беззнаковые типы int / long с Entity Framework?
источник
Я столкнулся с этой проблемой, потому что у меня была переменная-член только со
get
without set
свойствомэто означает, что это
auto calculated
иnot stored
как столбец вthe table
поэтому его
not exist
вtable schema
источник
ваш edmx и контекстная модель имеют некоторое различное свойство, которое недавно добавлено в db.
Обновите EDMX, обновите его должным образом. Создайте свой проект и запустите снова.
Это решит вашу проблему.
С уважением, Ганеш Никам
источник