【问题标题】:Improving Linq to entities query with not mapped properties将 Linq 改进为具有未映射属性的实体查询
【发布时间】:2012-12-17 06:34:06
【问题描述】:

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

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

提前感谢您的帮助。 廖。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复 Ladislav,我正在使用 SQLCE,所以存储过程不是解决方案,另一方面,我还远远不能擅长编写 T-SQL :),那就是为什么我选择 EF 作为数据访问技术,因为 linq 真的比 T-SQL 更容易写,在开始尝试编写 SQL 查询之前会继续尝试找到解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    相关资源
    最近更新 更多