如何在LINQ lambda扩展方法中插入方法

时间:2012-03-20 10:10:18

标签: c# linq methods

我必须在LINQ lambda中放置一个方法。我有以下代码:

string productName = "Some product";

searchShoppingCart = shoppingCart.Where(m => productName.Equals(_ProductRepository.GetProductName(m.Id)));

此代码基本上用于选择包含shoppingCart的所有productName个实例。

方法string GetProductName(int shoppingCartId)_ProductRepository中返回一个产品名称的方法。如何实现此方法及其逻辑无关紧要。

问题是LINQ抛出异常。我知道抛出此异常的原因,我只是想知道一个解决方法。我试过了

var productContained = shoppingCart.Select(sc => new
                    {
                        scId = sc.Id,
                        productName = _ProductRepository.GetProductName(sc.Id)
                    });

searchShoppingCart = shoppingCart.Where(sc => sc.Id.Equals(productContained.Where(pc => pc.productName.Equals(productName))
                                                                           .Select(pc => pc.Id)));

但它给了我同样的例外。还有其他解决方法吗?

更新

抛出的异常是

LINQ to Entities无法识别方法'System.String GetProductName(Int32)'方法,并且此方法无法转换为商店表达式。

2 个答案:

答案 0 :(得分:2)

它抛出一个异常,因为它试图将你的代码转换为SQL(并且它不能这样做)。阅读本文以获取一些解决方法:http://thoai-nguyen.blogspot.it/2011/05/custom-function-entity-framework.html

答案 1 :(得分:0)

如果您正在使用IQueryable(我相信您这样做),则无法将对自定义.NET方法的调用转换为查询 - 这就是您获得异常的原因。

解决方法是获取所有可能的购物车,然后将您的方法应用于内存产品列表 - 例如,

searchShoppingCart = shoppingCart.ToList().Where(m => productName.Equals(_ProductRepository.GetProductName(m.Id)))

当然,这很糟糕,因为它击败了整个目的!

更好的解决方法是在购物车对象中公开产品可导航属性并使用相同的 - 例如,

searchShoppingCart = shoppingCart.Where(m => productName.Equals(m.Product.Name))