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

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

string productName = "Some product"; searchShoppingCart = shoppingCart.Where(m => productName.Equals(_ProductRepository.GetProductName(m.Id))); 

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

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

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

 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))); 

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

UPDATE

抛出的exception是

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

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

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

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

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

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

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

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