我有一个临时报告系统;我对查询的源类型或所需字段没有编译时知识。我可以在运行时使用工厂方法编写表达式树System.Linq.Expressions.Expression
,并使用反射调用 LINQ 方法,但动态 LINQ 是一种更简单的解决方案。
报告系统将允许返回 LEFT JOIN 结果的查询。联接表中有字段在NOT NULL
数据库中;但因为这是 a 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);
动态 LINQ 支持显式转换:
// using static System.Linq.Dynamic.Core
var qry1 = range.Select("int?(it)");
但查询中只能引用一组特定的类型。如果我尝试Color
在查询中使用:
var qry2 = range.Select("Color(it)");
我收到以下错误:
“颜色”类型中不存在适用的方法“颜色”
如果我尝试显式转换为Color?
:
var qry3 = range.Select("Color?(it)");
我得到:
未找到请求的值“颜色”。
如何使用动态 LINQ 库来做到这一点?