我有一个问题:
return from smi in context.Smis
join smiInSegment in context.SmisInSegments on smi.Id equals smiInSegment.SmiId into smiToSmiInSegmentsJoin
from smiInSegment in smiToSmiInSegmentsJoin.DefaultIfEmpty()
select new SmiDtoInSegment
{
SmiDto = new SmiDto
{
.....
},
SmiInSegment = smiInSegment
};
}
我有一个建造者课程
internal static class SmiBuilder{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static SmiDto CreateSmiDto(this Smi smi)
{
return new SmiDto
{
.....
};
}
}
但是,当我这样使用时:
select new SmiDtoInSegment {
SmiDto = smi.CreateSmiDto(),
SmiInSegment = smiInSegment
};
抛出NotSupportedException: LINQ to Entities无法识别方法'Cat.DataAccess.Contracts.Dto.SmiDto CreateSmiDto(Cat.Data.Smi)'方法
使用不使用Extension方法会导致相同的结果
那么,内联由于某些原因不起作用?或者这种方式不能与EF查询一起使用?
答案 0 :(得分:1)
JIT所做的是.NET代码不可见的。 EF是一个普通的CLR程序集,它没有特殊的CLR钩子或能力。因此,你的理论不可能是真的。 JIT不可能帮助完成这项工作,因为用户代码无法检测到它的效果。
详细说明:EF无法检查或分析CreateSmiDto的主体。它无法将其转换为SQL。
LINQ to SQL 支持用户代码投影,如果它是查询的最后一件事。一个非常常见的场景和有用的功能。 EF仍然没有赶上L2S。您的查询只适用于L2S。
那么,内联由于某些原因不起作用?
我希望我已经解决了这个误解。这与内联无关。
或者这种方式不能与linq一起用于sql?
(您正在使用EF,而不是L2S。)不,这在当前产品版本中无法完成。 Vote for this user voice item.
答案 1 :(得分:-1)
Firts使用ToList()
从数据库中检索记录,然后使用Select()
return (from smi in context.Smis
join smiInSegment in context.SmisInSegments on smi.Id equals smiInSegment.SmiId into smiToSmiInSegmentsJoin
from smiInSegment in smiToSmiInSegmentsJoin.DefaultIfEmpty()).ToList()
.Select(x => new SmiDtoInSegment {...});