Asp.net mvc 改进具有未映射属性的Linq到实体查询

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

在将a查询发送到服务器以检索筛选结果之前,要正确构建a查询,我遇到了很多问题。首先,我查询了一组订单结果集,然后使用计算属性应用订单项目过滤器,当尝试重构以仅获取与项目条件匹配的订单集时,当然,我得到了错误:指定的类型成员“ReceivableQuantity”在LINQ to实体中不受支持。仅支持初始值设定项、实体成员和实体导航属性。 以下为工作代码:

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命令和两个查询,或者使用一个存储过程和两个查询

感谢您的回复Ladislav,我使用的是SQLCE,因此存储过程不是解决方案,另一方面,我远不擅长编写T-SQL:),这就是为什么我选择EF作为数据访问技术,因为使用linq比T-SQL更容易,将在开始尝试编写SQL查询之前继续尝试查找解决方案