System.Linq.Select方法错误:LINQ to Entities无法识别该方法

时间:2012-03-06 11:53:35

标签: c# linq linq-to-entities

美好的一天,

我的代码生成运行时错误,我不知道如何解决这个问题。任何帮助将不胜感激。

我们的代码通过传递“商品”列表来调用下面的第二个Convert方法。该优惠是EDMX模型的对象。第一个Convert方法获取对象并将其转换为DTO类,然后返回。

运行程序时,遇到以下错误:

  

LINQ to Entities无法识别方法'... Domain.Holdings.OfferDto Convert(... Repository.Offer,System.Nullable`1 [System.Int32])'方法,而且此方法无法翻译成商店表达。

代码如下:

public class OfferDtoMapping
{
    public static OfferDto Convert(Offer offer, int? participantId)
    {
        if (offer == null)
            throw new ArgumentException("The Offer object supplied for conversion cannot be null");

        var unitCost = offer.UnitCost;
        if (offer.Trust.Company.AllowInterDiv && participantId.HasValue)
        {
            Assign another value to unitCost...
        }

        var output = new OfferDto
        {               
            Assign the offer properties to the OfferDto properties...
        };
        return output;        
    }

    public static IList<OfferDto> Convert(IQueryable<Offer> offerList)
    {
        return offerList == null ? new List<OfferDto>() : offerList.Select(ol => Convert(ol, null)).ToList();
    }
}

此行发生错误:

 return offerList == null ? new List<OfferDto>() : offerList.Select(ol => Convert(ol, null)).ToList();

我怀疑这个错误与我在一个接受2个输入参数的方法上投射offerList的事实有关。我们尝试传递0而不是NULL(因为我们最初认为这是问题)但仍然得到类似的错误消息。

为了在整个解决方案中保持一致性,我们希望继续使用Select方法,而不是用foreach语句替换它。

在我们目前的情况下,有没有办法使用Select方法?

提前谢谢。

3 个答案:

答案 0 :(得分:2)

Linq To Entities尝试将您的Select语句转换为基础数据库的有效表达式。由于这不可能知道您的Convert方法,因此此转换失败,导致您看到错误。

您可以通过让Linq to Objects处理Select语句来解决这个问题。

offerList.ToList().Select(ol => Convert(ol, null));

答案 1 :(得分:2)

你无法从linq2entities中调用方法,你可以在linq2object中执行此操作,因此首先获取数据然后调用方法:

   return offerList == null ? new List<OfferDto>() : offerList.ToList()
                                                    .Select(ol => Convert(ol, null))
                                                    .ToList()

offerList.ToList()将数据从DB提取到内存中,然后您可以在其上运行linq2object方法。事实上,允许从linq2entity调用一些预定义的系统方法,并且不允许用户定义的方法(因为linq2sql不能创建表达式树)。

答案 2 :(得分:2)

发生错误是因为Linq中的Convert方法没有转换为实体。您需要首先通过在Iqueryable数据上调用ToList()来强制评估数据。然后,转换可以在Linq之外执行到内存中的Entites。

return offerList == null ? new List<OfferDto>() : offerList.ToList().Select(ol => Convert(ol, null)).ToList();