gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:58:40 25 4
gpt4 key购买 nike

我有一个问题:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com