我可以内联静态方法调用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)方法

不使用扩展方法会导致相同的结果

所以,内联不工作的原因是什么?

我可以内联静态方法调用EF查询

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 {...});