【问题标题】:Linq Select with inner method error - LINQ to Entities does not recognize the method带有内部方法错误的 Linq Select - LINQ to Entities 无法识别该方法
【发布时间】:2012-04-01 15:55:12
【问题描述】:

我正在为我的项目使用 View / Presenter 结构。该项目是一个包含 OrderedItems 和 Products 的电子商务网站。 调用 GetOrdersItemsByOrderID(orderID) 时,出现 LINQ 错误。

LINQ to Entities 无法识别方法 'DAL.Views.ProductView GetProductBySku(System.String)' 方法,并且该方法无法转换为商店表达式

我知道 LINQ 不喜欢其查询中的动态内容,所以问题是 SELECT 产品 = Presenters.ProductsPresenter.GetProductBySku(c.productSKU)

我不知道如何构建 GetOrdersItemsByOrderID TOLIST,同时还有另一个 GetProductBySku 方法填充字段 ProductDetail

/----------------/

public static List<OrderItemsView> GetOrdersItemsByOrderID(int orderID)
{
    using (var ctx = new ProductEntities())
{

    var result = ctx.OrderedItems.Where(o => o.orderID == orderID)
        .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();
    return result;
    }
}

/----------------/

public class OrderedItemsView
    {
        public int OrderItemID { get; set; }
        public int OrderID { get; set; }
        public string ProductSku { get; set; }
        public decimal ProductPrice { get; set; }
        public int ProdQuantity { get; set; }
        public decimal? ProductWeight { get; set; }

      public ProductView ProductDetail { get; set; } <-- Get Product Details
    }

/----------------/

public static Views.ProductView GetProductBySku(string sku)
    {
    using (GroupProductEntities ctx = new GroupProductEntities())
    {
        //-------------------------------------------------------------------//
        var results =
            ctx.Products.Where(p => p.clientID == Config.ClientID && p.productSKU == sku)
            .Select(p => new Views.ProductView
                             {
                                 ProductID = p.productID,
                                 ClientID = p.clientID,
                                 CategoryID = p.categoryID,
                                 ProductName = p.productName,
                                 ProductImage1 = p.productImage1,
                                 ProductPrice = p.productPrice,
                                 ProductInventory = p.productInventory,
                                 ProductSku = p.productSKU,
                             }).FirstOrDefault();
        return results;
    }
 }

/----------------/

public class ProductView
{
    public int ProductID { get; set; }
    public int? CategoryID { get; set; }
    public string ProductName { get; set; }
    public string ProductShortDesc { get; set; }
    public string ProductImage1 { get; set; }
    public decimal? ProductPrice { get; set; }
    public decimal? ProductInventory { get; set; }
    public string ProductSku { get; set; }
}

/----------------/

【问题讨论】:

    标签: c# linq entity-framework-4


    【解决方案1】:

    您可以在调用该方法之前添加一个“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 的末尾你可能还需要一个。

    【讨论】:

    • 哎呀。如果OrderedItems 听起来像这样,那么此代码将在任何实际数据上失效。
    • 我假设“Where”之后的 .ToList() 会受到适当的限制。
    • 完美 .. 移动 ToList 后,我​​需要返回 'results.ToList()' .. 谢谢
    • 你应该使用.AsEnumerable(),而不是.ToList()
    • @Robaticus:你应该在最后使用.ToList(),毕竟WhereSelect等等,并且只有当你确实需要一个列表 .但要从 SQL 查询转换为 C# 代码,您应该使用AsEnumerable。否则,您将生成列表只是为了实例化另一个迭代器(在本例中为Select),您可能必须从中创建 another 列表。那是多余的。用技术术语来说,AsEnumerable 维护惰性求值。
    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多