我可以内联静态方法调用EF查询
本文关键字:EF 查询 调用 静态方法 我可以 | 更新日期: 2023-09-27 18:06:16
我有一个查询:
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
};
}
我有一个builder类
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)方法
不使用扩展方法会导致相同的结果
所以,内联不工作的原因是什么?
JIT所做的对。net代码是不可见的。EF是一个普通的CLR程序集,它没有特殊的CLR挂钩或能力。因此,你的理论不可能是正确的。JIT不可能帮助完成这项工作,因为它的影响是用户代码无法检测到的。
详细说明:EF无法检查或分析CreateSmiDto的主体。它不能将其转换为SQL。
LINQ to SQL did支持用户代码投影,如果它是查询所做的最后一件事。一个非常常见的场景和一个有用的特性。EF仍然没有赶上L2S。您的查询只适用于L2S。
我希望我已经澄清了这个误解。这与内联无关。所以,内联不工作的原因是什么?
或者这种方式不能用于linq to sql ?
(您正在使用EF,而不是L2S)不可以,目前的产品版本不能这样做。
首先使用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 {...});