这是我发现的常见错误,但我不确定如何修复它。
LINQ to Entities does not recognize the method
'System.Linq.IQueryable`1[ProjectX.Models.DTOs.ExampleDTOUDC] Select(Int32)'
method, and this method cannot be translated into a store expression.
以下是有问题的违规代码。
public IQueryable<ExampleDTO> Select()
{
return from e in db.vw_Example
select new ExampleDTO()
{
exampleUDCs = new ExampleUDCRepository().Select(v.VehicleID).AsEnumerable()
//etc
};
}
和ExampleUDCRepository.Select()方法是:
public IQueryable<ExampleUDCDTO> Select(int id)
{
return from eudc in db.ExampleUDCs
where eudc.ExampleID == id
select new ExampleUDCDTO()
{
ExampleID = eudc.ExampleID,
//etc
};
}
我理解为什么Linq需要将所有内容都放在一个可以转换为SQL查询的形式中,但是我不明白为什么这样可行我从第一个Select()
方法中获取相同的查询并且类似的东西:
public IQueryable<ExampleDTO> Select()
{
return from e in db.vw_Example
select new ExampleDTO()
{
ExampleID = e.ExampleID,
ExampleUDCs = (from eudc in db.ExampleUDCs
where eudc.ExampleID == id
select new ExampleUDCDTO()
{
ExampleID = eudc.ExampleID
//etc
})
};
}
如果你想看到它,这是我的ExampleDTO类中的ExampleUDCs声明:
public IEnumerable<ExampleUDCDTO> ExampleUDCs { get; set; }
是否有人知道我可以通过ExampleUDCDTO().Select(int id)
方法重复使用代码而不是将所有查询放入第一个Select()
方法中来解决此问题?
如果您需要更多信息,请与我们联系。谢谢。
答案 0 :(得分:1)
实体框架与表达式一起使用,它尝试将完整表达式编译成一段SQL。由于您正在创建一个带有方法调用的表达式,因此EF也尝试将该方法调用编译为SQL。这是不可能的。