gpt4 book ai didi

c# - 如何使用 LINQ to Entities 初始化匿名类型?

转载 作者:行者123 更新时间:2023-12-03 02:49:28 25 4
gpt4 key购买 nike

LINQ toEntity支持匿名类型作为返回类型,例如:

var query = from a in b.C select new { Value = a.Value };

编译器生成的代码将类似于:

private class f__AnonymousType0<j__TPar>
{
private readonly j__TPar i__Field;
public j__TPar Value
{
get { return i__Field; }
}

public f__AnonymousType0(j__TPar Value)
{
i__Field = Value;
}
}

但是如果我使用生成的匿名类型实例:

var query = from a in b.C select new f__AnonymousType0<string>(a.Value);

错误:

System.NotSupportedException: Only parameterless constructors and initializers are supported in LINQ to Entities.

将被抛出。

那么匿名类型在这里是如何工作的呢?

最佳答案

如果编译器必须执行一个匿名类型初始值设定项,那么它最终会调用构造函数。但在 LINQ to Entities 或任何其他基于 IQueryable 的 LINQ 提供程序中,代码实际上并未执行......它只是转换为表达式树。

所以在您的示例中:

var query = from a in b.C select new { Value = a.Value };

...将转换为对 Expression.New 的调用它有效地表示匿名类型初始值设定项。至关重要的是(我相信),它使用 Members 创建一个 NewExpression属性设置为指示 Value 属性是从构造函数的第一个参数初始化的。

我希望 LINQ to Entities 分析 NewExpression 来弄清楚原始代码的含义,并推断需要执行哪些操作才能将其转换为 SQL。仅通过构造函数调用无法做到这一点。

关于c# - 如何使用 LINQ to Entities 初始化匿名类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48418633/

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