我有一个临时报告系统;我对查询的源类型或所需字段没有编译时知识。我可以使用在运行时编写表达式树System.Linq.Expressions.Expression
工厂方法,并使用反射调用 LINQ 方法,但动态 LINQ 是一个更简单的解决方案。
报告系统允许返回 LEFT JOIN 结果的查询。连接表中有一些字段是NOT NULL
在数据库中;但因为这是一个LEFT JOIN
,这些字段将包含NULL
对于某些记录。 EF6 生成的表达式属于这种情况,因为该表达式投影为不可为 null 的值类型。
如果我在编译时 LINQ 中执行此操作,我将显式转换为可为 null 类型:
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)");
但只有一个特定类型集 https://github.com/StefH/System.Linq.Dynamic.Core/wiki/Dynamic-Expressions#types可以在查询中引用。如果我尝试使用Color
在查询中:
var qry2 = range.Select("Color(it)");
我收到以下错误:
“颜色”类型中不存在适用的方法“颜色”
如果我尝试显式转换为Color?
:
var qry3 = range.Select("Color?(it)");
I get:
未找到请求的值“颜色”。
如何使用动态 LINQ 库来做到这一点?
动态 LINQ 提供了Cast
可以使用如下方法:
var range = Enumerable.Range(0,3).Select(x => (Color)x).AsQueryable();
var castDynamic = range.Cast(typeof(Color?)).ToDynamicArray();
castDynamic.Dump();
您还可以传递带有输出类型名称的字符串。请注意,对于可为 null 的类型,您需要类型的全名:
string s = typeof(Color?).FullName;
s.Dump();
var castDynamicFromString = range.Cast(s);
castDynamicFromString.Dump();
Cast
也可以在动态 LINQ 字符串表达式中使用,或者传入一个Type
对象作为参数,或直接使用名称:
var castInSelect = range.Select($@"Cast(""{s}""").ToDynamicArray();
castInSelect.Dump();
LINQPad 中的输出:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)