仅支持初始化器,实体成员和实体导航属性
我得到这个例外:
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中的属性。
- 在数据库模型中查找名称为
Foo
的[NotMapped]
属性。 - 在视图模型中寻找一个名字相同的属性
Foo
。 - 如果是这种情况,那么改变你的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 calculated
而not stored
作为一个列not stored
在the table
因此它not exist
于table schema
所以请
make sure
任何not auto calculated
成员variableshave
getter
和setter
属性
- AsNoTracking()做了什么差别?
- 为什么LINQ to Entities不能识别方法System.String ToString()?
- “System.Data.Entity.Internal.AppConfig”的types初始值设定项引发exception
- LINQ to Entities不支持“date”。 仅支持初始化器,实体成员和实体导航属性
- 在Entity Framework 4中默认禁用延迟加载
- EF无法从#temp表中select从存储过程select返回模式
- 从entity framework中删除单个logging?
- 更新你的EDMX,以反映你的数据库(.net LINQ实体)
- EF LINQ包含多个嵌套实体