c# - 我可以将静态方法调用内联到 EF 查询吗

标签 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)”方法

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

那么,出于某些原因,内联不起作用?或者这种方式不能与 EF 查询一起使用?

最佳答案

JIT 的作用对 .NET 代码是不可见的。 EF 是一个普通的 CLR 程序集,它没有特殊的 CLR Hook 或能力。因此,你的理论不可能是真的。 JIT 不可能帮助完成这项工作,因为用户代码无法检测到它的效果。

详细说明:EF 无法检查或分析 CreateSmiDto 的主体。它无法将其转换为 SQL。

LINQ to SQL 确实支持用户代码投影,如果它是查询所做的最后一件事。一个非常常见的场景和一个有用的功能。 EF还是没有 catch L2S。您的查询只适用于 L2S。

So, Inlining doesn't work for some reasons?

我希望我已经消除了这个误会。这与内联无关。

Or this way cannot be used with linq to sql ?

(您使用的是 EF,而不是 L2S。)不,当前产品版本无法做到这一点。 Vote for this user voice item.

关于c# - 我可以将静态方法调用内联到 EF 查询吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24011805/

相关文章:

c# - 缓存 Linq 查询问题

c# - 在 C++ 中定义的以下结构的 C# 等价物是什么

c# - 继承和基础构造函数

c# - F# 属性与 C# 属性

c# - EF 核心 'another instance is already being tracked'

sql-server - TransactionScope 锁定表和 IsolationLevel

.net - 存储库本身通常不经过测试?

c# - 如何在 C# 中使用 Bouncy CaSTLe 将 X.509 v.3 谷歌证书添加到项目中

c# - 表达式树知道日期是否在 C# 中的 2 个日期之间

c# - 具有多个 OR 条件的 Linq to Entity Join 表