Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей


Я получаю это исключение :

указанный член типа '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 92

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 при сопоставлении модели БД с моделью представления.

  1. искать [NotMapped] свойство с именем Foo в вашей БД Модель.
  2. найдите свойство с тем же именем, Foo в вашей модели представления.
  3. если это так,то измените конфигурацию 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?

я столкнулся с этой проблемой, потому что имел переменную-член только с getwithout set свойства

что это значит auto calculated и not stored в столбце the table

его not exist на table schema

так make sure что любая переменная-член not auto calculated до have a getter и setter свойства