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

时间:2014-06-03 09:38:16

标签: c# linq entity-framework linq-to-sql linq-to-entities

我有一个问题:

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查询一起使用?

2 个答案:

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