Linq Select with inner method error - LINQ to Entities does not recognize the method Linq使用内部方法的选择错误 - LINQ to Entities不识别该方法

13 浏览
0 Comments

Linq Select with inner method error - LINQ to Entities does not recognize the method Linq使用内部方法的选择错误 - LINQ to Entities不识别该方法

我正在为我的项目使用View/Presenter结构。该项目是一个有OrderedItems和Products的电子商务网站。\n当调用GetOrdersItemsByOrderID(orderID)时,我遇到了一个LINQ错误。\nLINQ to Entities无法识别\'DAL.Views.ProductView GetProductBySku(System.String)\'方法,并且无法将此方法转换为存储表达式。\n我知道LINQ不喜欢在其查询中使用动态内容,所以问题出在SELECT语句中的Product = Presenters.ProductsPresenter.GetProductBySku(c.productSKU)。\n我不知道如何在构建GetOrdersItemsByOrderID TOLIST的同时,还要使用另一个GetProductBySku方法填充ProductDetail字段。\npublic static List GetOrdersItemsByOrderID(int orderID)\n{\n using (var ctx = new ProductEntities())\n {\n var result = ctx.OrderedItems.Where(o => o.orderID == orderID)\n .Select(c => new OrderedItemsView\n {\n OrderItemID = c.orderItemID,\n OrderID = c.orderID,\n ProductSku = c.productSKU,\n ProductPrice = c.productPrice,\n ProdQuantity = c.prodQuantity,\n ProductDetail = Presenters.ProductsPresenter.GetProductBySku(c.productSKU)\n }).ToList();\n return result;\n }\n}\npublic class OrderedItemsView\n{\n public int OrderItemID { get; set; }\n public int OrderID { get; set; }\n public string ProductSku { get; set; }\n public decimal ProductPrice { get; set; }\n public int ProdQuantity { get; set; }\n public decimal? ProductWeight { get; set; }\n public ProductView ProductDetail { get; set; } <-- 获取产品详细信息\n}\npublic static Views.ProductView GetProductBySku(string sku)\n{\n using (GroupProductEntities ctx = new GroupProductEntities())\n {\n var results =\n ctx.Products.Where(p => p.clientID == Config.ClientID && p.productSKU == sku)\n .Select(p => new Views.ProductView\n {\n ProductID = p.productID,\n ClientID = p.clientID,\n CategoryID = p.categoryID,\n ProductName = p.productName,\n ProductImage1 = p.productImage1,\n ProductPrice = p.productPrice,\n ProductInventory = p.productInventory,\n ProductSku = p.productSKU,\n }).FirstOrDefault();\n return results;\n }\n}\npublic class ProductView\n{\n public int ProductID { get; set; }\n public int? CategoryID { get; set; }\n public string ProductName { get; set; }\n public string ProductShortDesc { get; set; }\n public string ProductImage1 { get; set; }\n public decimal? ProductPrice { get; set; }\n public decimal? ProductInventory { get; set; }\n public string ProductSku { get; set; }\n}

0
0 Comments

在使用LINQ查询时,可能会遇到"LINQ to Entities does not recognize the method"的错误。这个错误的原因是LINQ to Entities无法识别方法。 解决这个问题的方法是执行查询之前添加一个"ToList"方法。

下面是一个示例代码:

var result = ctx.OrderedItems.Where(o => o.orderID == orderID).ToList()
    .Select(c => new OrderedItemsView
                     {
                         OrderItemID = c.orderItemID,
                         OrderID = c.orderID,
                         ProductSku = c.productSKU,
                         ProductPrice = c.productPrice,
                         ProdQuantity = c.prodQuantity,
                         ProductDetail = Presenters.ProductsPresenter.GetProductBySku(c.productSKU)
                     });

在这个例子中,我们使用了".ToList()"方法来执行查询,并将结果转换为列表。这样,我们就可以在调用"Select"方法时,使用我们自己的方法"Presenters.ProductsPresenter.GetProductBySku"。

然而,如果数据量很大,这段代码可能会出错。为了解决这个问题,我们可以使用".AsEnumerable()"方法代替".ToList()"方法。

下面是修改后的代码:

var result = ctx.OrderedItems.Where(o => o.orderID == orderID).AsEnumerable()
    .Select(c => new OrderedItemsView
                     {
                         OrderItemID = c.orderItemID,
                         OrderID = c.orderID,
                         ProductSku = c.productSKU,
                         ProductPrice = c.productPrice,
                         ProdQuantity = c.prodQuantity,
                         ProductDetail = Presenters.ProductsPresenter.GetProductBySku(c.productSKU)
                     }).ToList();

这样做的好处是,我们可以延迟查询的执行,只有在需要时才会将结果转换为列表。这样可以避免不必要的列表生成,提高查询的效率。

,当遇到"Linq Select with inner method error - LINQ to Entities does not recognize the method"错误时,可以通过使用".ToList()"方法或".AsEnumerable()"方法来解决。使用".ToList()"方法会立即执行查询并将结果转换为列表,而使用".AsEnumerable()"方法可以延迟查询的执行,提高查询的效率。

0