Asp.net mvc 改进具有未映射属性的Linq到实体查询
在将a查询发送到服务器以检索筛选结果之前,要正确构建a查询,我遇到了很多问题。首先,我查询了一组订单结果集,然后使用计算属性应用订单项目过滤器,当尝试重构以仅获取与项目条件匹配的订单集时,当然,我得到了错误:指定的类型成员“ReceivableQuantity”在LINQ to实体中不受支持。仅支持初始值设定项、实体成员和实体导航属性。 以下为工作代码:Asp.net mvc 改进具有未映射属性的Linq到实体查询,asp.net-mvc,entity-framework,linq-to-entities,iqueryable,Asp.net Mvc,Entity Framework,Linq To Entities,Iqueryable,在将a查询发送到服务器以检索筛选结果之前,要正确构建a查询,我遇到了很多问题。首先,我查询了一组订单结果集,然后使用计算属性应用订单项目过滤器,当尝试重构以仅获取与项目条件匹配的订单集时,当然,我得到了错误:指定的类型成员“ReceivableQuantity”在LINQ to实体中不受支持。仅支持初始值设定项、实体成员和实体导航属性。 以下为工作代码: pendingOrders = from o in this.GetAll() where o.OrderIt
pendingOrders = from o in this.GetAll()
where o.OrderItems.Where(i => i.ReceivableQuantity > 0).Count() > 0
select new Order()
{
OrderNumber = o.OrderNumber,
Comments = o.Comments,
FinalApprover = o.FinalApprover,
OrderDate = o.OrderDate,
Requisitioner = o.Requisitioner,
SupplierName = o.SupplierName,
ID = o.ID,
ShoppingCartName = o.ShoppingCartName,
OrderItems = (from i in o.OrderItems
where i.ReceivableQuantity > 0
select i).OrderBy(i => i.LineNumber).ToList()
};
这是OrderItem类中的NotMapped属性:
[NotMapped]
public decimal ReceivableQuantity
{
get
{
if (Order == null)
return 0;
decimal response;
response = this.MatchedQuantity - this.ReceivedQuantity;
if (response >= 0)
return response;
else
throw new ArgumentOutOfRangeException("Receivable Quantity must be greater than 0.");
}
}
MatchedQuantity和ReceivedQuantity也是不映射的属性,所以我认为这是真正的扩展
既然使用它的站点已经在运行,并且随着数据库每天的增长,使用代码的特性变得非常缓慢,那么我应该使用什么样的最佳方法呢
提前感谢你的帮助。
Lio.我猜您使用的是代码优先映射。当涉及高级查询时,这种方法非常有限,因为它仍然不支持SQL函数映射。因此,您有以下选择:
- 将所有未映射属性的整个计算直接放入LINQtoEntities查询中。这会让你的问题变得很棘手
- 摆脱该查询并使用两个存储过程—第一个用于获取与条件匹配的所有订单,第二个用于获取与条件匹配的所有订单的所有订单项。您可以使用
调用这些存储过程Database.SqlQuery
- 不要使用EF,直接用SQL执行查询。在这种情况下,您甚至可以使用一个SQL命令和两个查询,或者使用一个存储过程和两个查询