gpt4 book ai didi

c# - 将我的值类型转换为可空等效类型

转载 作者:行者123 更新时间:2023-12-02 09:49:16 30 4
gpt4 key购买 nike

我有一个临时报告系统;我对查询的源类型或所需字段没有编译时知识。我可以在运行时使用 System.Linq.Expressions.Expression 工厂方法编写表达式树,并使用反射调用 LINQ 方法,但动态 LINQ 是一个更简单的解决方案。

报告系统允许返回 LEFT JOIN 结果的查询。连接表中有一些字段在数据库中为NOT NULL;但由于这是LEFT JOIN,因此这些字段将包含某些记录的NULL。 EF6 生成的表达式属于这一点,因为该表达式投影为不可为 null 的值类型。

如果我在编译时 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)");

但只有specific set of types可以在查询中引用。如果我尝试在查询中使用 Color:

var qry2 = range.Select("Color(it)");

我收到以下错误:

No applicable method 'Color' exists in type 'Color'

如果我尝试显式转换为 Color?:

var qry3 = range.Select("Color?(it)");

我得到:

Requested value 'Color' was not found.

如何使用动态 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 中的输出:

enter image description here

关于c# - 将我的值类型转换为可空等效类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60692533/

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