使用非映射属性将Linq改进为实体查询

时间:2013-01-02 21:48:46

标签: asp.net-mvc entity-framework linq-to-entities iqueryable

我在将查询正确构建之前遇到很多问题,然后再将其发送到服务器以检索过滤结果,fisrt我正在查询订单的孔结果集,然后使用计算属性应用订单商品过滤器,当试图重构只获得与项目标准匹配的订单集时,我当然得到错误:LINQ to Entities中不支持指定的类型成员'ReceivableQuantity'。仅支持初始值设定项,实体成员和实体导航属性。 工作代码下方:

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也是NotMapped属性,所以我认为这确实是在扩展。

我使用它的最佳方法是什么,现在使用它的网站已经在运行,随着数据库日益增长,使用代码的功能变得非常慢。

提前感谢您的帮助。 LIO。

1 个答案:

答案 0 :(得分:0)

我猜您正在使用代码优先映射。这种方法在高级查询时非常有限,因为它仍然不支持SQL函数映射。因此,您有以下选择:

  • 将所有未映射的属性的整个计算直接放入Linq-to-entities查询中。这可能会让你的查询非常讨厌。
  • 摆脱该查询并使用两个存储过程 - 第一个用于获取符合条件的所有订单,第二个用于获取符合条件的所有订单的所有订单商品。您可以使用Database.SqlQuery
  • 调用这些存储过程
  • 不要使用EF并直接使用SQL执行查询。在这种情况下,您甚至可以使用一个带有两个查询的SQL命令,一个存储过程包含两个查询。