美好的一天,
我的代码生成运行时错误,我不知道如何解决这个问题。任何帮助将不胜感激。
我们的代码通过传递“商品”列表来调用下面的第二个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方法?
提前谢谢。
答案 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();