Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей
Я получаю это исключение :
указанный член типа '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);
}
7 ответов:
Entity пытается преобразовать ваше платное свойство в SQL и не может, потому что оно не является частью схемы таблицы.
то, что вы можете сделать, это позволить сущности запрашивать таблицу без платного фильтра, а затем отфильтровать неоплаченные.
public ActionResult Index() { var debts = storeDB.Orders //.Where(o => o.Paid == false) .OrderByDescending(o => o.DateCreated); debts = debts.Where(o => o.Paid == false); return View(debts); }
это, конечно, будет означать, что вы возвращаете все данные обратно на веб-сервер и фильтруете данные на нем. Если вы хотите фильтровать на сервере БД, вы можете создать вычисляемый столбец в таблице или использовать сохраненный Процедура.
просто нужно было решить аналогичную проблему. Решения выше требуют обработки в памяти, что является плохой практикой (ленивая загрузка).
мое решение состояло в том, чтобы написать помощник, который вернул предикат:
public static class Extensions { public static Expression<Func<Order, bool>> IsPaid() { return order => order.Payments.Sum(p => p.Amount) >= order.Total; } }
вы можете переписать свой оператор linq как:
var debts = storeDB.Orders .Where(Extensions.IsPaid()) .OrderByDescending(o => o.DateCreated);
это удобно, когда вы хотите повторно использовать логику расчета (сухой). Недостатком является то, что логика не находится в вашей модели домена.
Linq преобразует операторы в операторы SQL и выполняет их в база данных.
теперь это преобразование выполняется только для элементов сущностей, инициализаторов и свойств навигации сущностей. Поэтому для достижения функции или сравнения свойств нам нужно сначала преобразовать их в список в памяти, а затем применить функцию для извлечения данных.
поэтому в целом,
var debts = storeDB.Orders.toList() .Where(o => o.Paid == false) .OrderByDescending(o => o.DateCreated);
эта проблема также может исходить от
[NotMapped]
свойство, которое имеет то же имя в вашей модели БД и модели представления.AutoMapper пытается выбрать его из БД во время проекции; и свойство NotMapped, очевидно, не существует в БД.
решение:
Ignore
свойство в конфигурации AutoMapper при сопоставлении модели БД с моделью представления.
- искать
[NotMapped]
свойство с именемFoo
в вашей БД Модель.- найдите свойство с тем же именем,
Foo
в вашей модели представления.- если это так,то измените конфигурацию AutoMapper. Добавить
.ForMember(a => a.Foo, b => b.Ignore());
другая вероятная причина заключается в том, что вы используете
IEnumerable
для вашего имущества, вместоICollection
так вместо:
public class This { public long Id { get; set; } //... public virtual IEnumerable<That> Thats { get; set; } }
этого:
public class This { public long Id { get; set; } //... public virtual ICollection<That> Thats { get; set; } }
а ты красавчик Дори... глупо терять 2 часа...
эта ситуация также может произойти, если вы используете не поддерживается типами EntityFramework, например unsigned int.
Это был мой случай такой ошибки.
извлечение дополнительной информации о поддерживаемых типах: https://msdn.microsoft.com/en-us/library/ee382832 (v=vs. 100). aspx
есть некоторые обходные пути для таких ситуаций, объяснил GFoley83: как использовать unsigned int / long типы с Entity Framework?