标签: dynamic-linq-core

将我的值类型转换为可空等价物

我有一个特别报告系统;我对查询的源类型或所需字段没有编译时知识。我可以在运行时使用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);
Run Code Online (Sandbox Code Playgroud)

动态 LINQ 支持显式转换:

// using static System.Linq.Dynamic.Core

var qry1 = range.Select("int?(it)");
Run Code Online (Sandbox Code Playgroud)

但在查询中只能引用一组特定的类型。如果我尝试Color在查询中使用:

var qry2 = range.Select("Color(it)");
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

“颜色”类型中不存在适用的方法“颜色”

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

var qry3 …
Run Code Online (Sandbox Code Playgroud)

c# linq dynamic-linq dynamic-linq-core

5
推荐指数
1
解决办法
484
查看次数

如何在其他给定的 Guid 列表中的 Queryable 之上执行 OrderBy

我有搜索服务,它将为我提供具有正确顺序的实体的指南列表。例如,我的搜索服务给了我这个结果:

// Assuming you have a list of Guids named 'guidList'
List<Guid> guidList = new List<Guid>
{
    Guid.NewGuid(),
    Guid.NewGuid(),
    Guid.NewGuid()
};
Run Code Online (Sandbox Code Playgroud)

现在,我需要对数据库进行查询以获取这些实体:

using (var context = new YourDbContext())
{
    var students = context.Students
        .Where(e => guidList.Contains(e.Guid));
}
Run Code Online (Sandbox Code Playgroud)

我想以与 guidList 相同的顺序获取我的实体。执行 AsEnumerable 在这里不起作用,因为我将在最后添加另一个查询,这可能会影响性能

c# linq entity-framework-core dynamic-linq-core

2
推荐指数
1
解决办法
80
查看次数