Мое обходное решение:
function add(a, b, precision) {
var x = Math.pow(10, precision || 2);
return (Math.round(a * x) + Math.round(b * x)) / x;
}
precision относится к числу цифр, которые вы хотите сохранить после десятичной точки во время добавления.
Entity пытается преобразовать ваше свойство Paid в SQL и не может, потому что оно не является частью схемы таблицы.
Что вы можете сделать, так это позволить Entity запросить таблицу без фильтра Paid, а затем отфильтровать не оплаченные.
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);
}
Это, конечно, означало бы, что вы приносите все данные возвращаются на веб-сервер и фильтруют данные на нем. Если вы хотите отфильтровать на сервере БД, вы можете создать расчетный столбец в таблице или использовать хранимую процедуру.
Я столкнулся с этой проблемой, потому что имел переменную-член только с get
without set
свойством
, что означает ее auto calculated
и not stored
в качестве столбца в the table
, поэтому его not exist
в table schema
, поэтому
blockquote>make sure
, что любая переменная-членnot auto calculated
доhave
agetter
иsetter
свойства
Эта проблема также может исходить из свойства [NotMapped]
, которое имеет одно и то же имя в вашей модели БД и модели представления.
AutoMapper пытается выбрать его из БД во время проекции; и свойство NotMapped, очевидно, не существует в БД.
Решением является Ignore
свойство в конфигурации AutoMapper при сопоставлении из модели БД модели View.
[NotMapped]
с именем Foo
в вашей модели DB. Foo
в вашей модели просмотра. .ForMember(a => a.Foo, b => b.Ignore());
Просто пришлось решить подобную проблему. [3]
Мое решение состояло в том, чтобы написать помощника, который вернул предикат:
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);
Это удобно, если вы хотите повторно использовать логику вычисления (DRY). Недостатком является то, что логика не в вашей модели домена.
Эта ситуация также может произойти, если вы используете , не поддерживаемые типами EntityFramework , например unsigned int.
Это был мой случай такой ошибки.
Оформить дополнительную информацию о поддерживаемых типах: https://msdn.microsoft.com/en-us/library/ee382832 (v = vs.100) .aspx
Существует некоторое обходное решение для таких ситуаций, объясняемое GFoley83: Как использовать unsigned int / long типы с Entity Framework?
Другая вероятная причина заключается в том, что вы используете 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 часа ...
Linq преобразует операторы в операторы SQL и выполняет их в базу данных.
blockquote>Теперь это преобразование происходит только для членов сущностей, инициализаторов и свойств навигации сущности. Таким образом, чтобы достичь функции или получить сравнение свойств, нам нужно сначала преобразовать их в список в памяти, а затем применить функцию для извлечения данных.
Поэтому в совокупности
var debts = storeDB.Orders.toList() .Where(o => o.Paid == false) .OrderByDescending(o => o.DateCreated);