我有一个特别报告系统;我对查询的源类型或所需字段没有编译时知识。我可以在运行时使用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) 我有搜索服务,它将为我提供具有正确顺序的实体的指南列表。例如,我的搜索服务给了我这个结果:
// 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 在这里不起作用,因为我将在最后添加另一个查询,这可能会影响性能