如何解决为什么我不能在 LINQ-to-SQL 连接方法中使用实际的类?
我正在尝试在 C# 中进行 LINQ 连接(使用 EntityFramework Core 3.1.13),该连接在键选择器中使用一个类。
例如:
public class KeyClass {
public int Key { get; set; }
}
using (var Context = new ...Context()) {
var Query = Context.Table1.Join(Context.Table2,x => new KeyClass () { Key = x.ID },x => new KeyClass() { Key = x.ID2 },(x,y) => new { x,y });
}
当我使用 KeyClass 时它不起作用 - 我收到一个错误,指出无法翻译 LINQ 表达式。
但是如果我改用匿名类型,它就可以正常工作:
using (var Context = new ...Context()) {
var Query = Context.Table1.Join(Context.Table2,x => new { Key = x.ID },x => new { Key = x.ID2 },y });
}
在我的情况下,我不能使用匿名类型,因为我希望能够在运行时动态构建连接,并且需要为键选择器使用发出的类型,因为它可能有多个键和不同的类型。
解决方法
原因是因为 EFC 转换器仅支持带参数的 Expression.New
(C# new
) 构造函数调用,而不支持连接键的 Expression.MemberInit
(C# 对象初始值设定项)。
匿名类型和元组都属于第一类(事件虽然语法上匿名类型分配看起来像对象初始值设定项,实际上它是编译器生成类的构造函数调用 - 类似于 C#9 记录声明),而您的类没有。
知道所有这些,解决方案实际上很简单 - 只需在类中添加并使用构造函数,例如
public class KeyClass
{
public KeyClass(int key) => Key = key;
public int Key { get; }
}
或在 C#9 中
public record KeyClass(int Key);
现在这有效(翻译)
var Query = Context.Table1.Join(Context.Table2,x => new KeyClass(x.ID),x => new KeyClass(x.ID2),(x,y) => new { x,y });
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。