仅支持初始化器,实体成员和实体导航属性

我得到这个例外:

LINQ to Entities不支持指定的types成员“Paid”。 仅支持初始化器,实体成员和实体导航属性。

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); } } 

Payments是一个包含字段金额的相关表,如果我删除Where子句显示有关付款的正确信息,任何线索有什么问题的代码查询工程?

解决像回答build议:

  public ActionResult Index() { var debts = storeDB.Orders .OrderByDescending(o => o.DateCreated) .ToList() .Where(o => o.Paid == false); return View(debts); } 

实体试图将您的Paid属性转换为SQL,因为它不是表模式的一部分。

你可以做的是让实体查询没有付费filter的表,然后过滤掉没有付费的。

 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); } 

当然,这意味着你将所有的数据都带回到Web服务器上并过滤数据。 如果要在数据库服务器上进行筛选,则可以在表上创build一个计算列或使用存储过程。

刚刚解决了类似的问题。 上面的解决scheme需要在内存中处理,这是一个不好的做法(延迟加载)。

我的解决scheme是写一个返回谓词的助手:

 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)时,这很方便。 缺点是逻辑不在你的领域模型中。

Linq将这些语句转换成SQL语句并将其执行到数据库中。

现在,这种转换只发生在实体成员,初始化器和实体导航属性上。 所以要实现函数或者获取属性比较,首先需要将它们转换成内存中的列表,然后再使用函数来获取数据。

所以总的来说,

 var debts = storeDB.Orders.toList() .Where(o => o.Paid == false) .OrderByDescending(o => o.DateCreated); 

此问题也可能来自数据库模型和视图模型中具有相同名称的[NotMapped]属性。

AutoMapper尝试在投影期间从DB中select它; 而且NotMapped属性显然不存在于数据库中。

解决scheme是在从数据库模型映射到视图模型时Ignore AutoMapperconfiguration中的属性。

  1. 在数据库模型中查找名称为Foo[NotMapped]属性。
  2. 在视图模型中寻找一个名字相同的属性Foo
  3. 如果是这种情况,那么改变你的AutoMapperconfiguration。 添加.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个小时以上…

我面临这个问题,因为有一个成员variables只有without set属性

这意味着它的auto calculatednot stored作为一个列not storedthe table

因此它not existtable schema

所以请make sure任何not auto calculated成员variableshave gettersetter属性