【发布时间】:2020-06-26 18:32:06
【问题描述】:
我有一个临时报告系统;我对查询的源类型或所需字段没有编译时知识。我可以在运行时使用 System.Linq.Expressions.Expression 工厂方法编写表达式树,并使用反射调用 LINQ 方法,但动态 LINQ 是一种更简单的解决方案。
报告系统将允许返回 LEFT JOIN 结果的查询。连接表中有字段在数据库中为NOT NULL;但是因为这是LEFT JOIN,所以对于某些记录,这些字段将包含NULL。 EF6 生成的表达式落在此之上,因为表达式投影为不可为空的值类型。
如果我在编译时 LINQ 中执行此操作,我会显式转换为可空类型:
enum Color { Red, Green, Blue }
// using System;
// using static System.Linq.Enumerable;
// using System.Linq;
var range = Range(0, 3).Select(x => (Color)x).AsQueryable();
var qry = range.Select(x => (Color?)x);
Dynamic LINQ 支持显式转换:
// using static System.Linq.Dynamic.Core
var qry1 = range.Select("int?(it)");
但查询中只能引用specific set of types。如果我尝试在查询中使用Color:
var qry2 = range.Select("Color(it)");
我收到以下错误:
“颜色”类型中不存在适用的方法“颜色”
如果我尝试显式转换为 Color?:
var qry3 = range.Select("Color?(it)");
我明白了:
未找到请求的值“颜色”。
如何使用动态 LINQ 库来做到这一点?
【问题讨论】:
-
在枚举中为NONE添加一项
-
@jdweng 最终我需要这个来从 LEFT JOIN 获取所需列中的值;如果
JOINed 表中没有相应的记录,则所述值将为NULL。此外,这对于非枚举值类型也无济于事。 -
你是在数据库中存储枚举的名称还是在数据库中存储整数值?
-
@Saravanan 整数值。
-
您需要使用 LINQ 吗?
标签: c# linq dynamic-linq dynamic-linq-core