2

在将查询发送到服务器以检索过滤结果之前,我有很多问题要正确构建查询,首先我正在查询订单的空洞结果集,然后在尝试时应用具有计算属性的订单项目过滤器重构以仅获取与项目条件匹配的订单集,当然我得到了错误: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 属性,所以我认为这确实在扩展。

我应该使用什么最好的方法,现在使用它的网站已经在运行,并且随着数据库每天都在增长,使用代码的功能变得非常缓慢。

在此先感谢您的帮助。廖。

4

1 回答 1

0

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

  • 将所有未映射属性的整个计算直接放入 Linq-to-entities 查询中。这会使您的查询非常讨厌。
  • 摆脱该查询并使用两个存储过程 - 第一个获取与您的条件匹配的所有订单,第二个获取与您的条件匹配的所有订单的所有订单项。您可以使用Database.SqlQuery.
  • 不要使用 EF 并直接使用 SQL 执行查询。在这种情况下,您甚至可以使用一个 SQL 命令和两个查询,或者一个存储过程和两个查询。
于 2013-01-02T22:49:30.003 回答