c# - 如何将 LINQ IQueryable / Expression 解构为组成部分?
问题描述
我正在编写一个扩展方法,旨在帮助在 EF Core 中实际执行 LINQ 查询之前准备它。
例如:
var context = new SchoolContext();
var studentWithGrade = context.Students
.Where(s => s.FirstName == "Bill")
.Include(s => s.Grade)
.Prepare()
.FirstOrDefault();
我正在界面上构建Prepare()
扩展。IQueryable<>
在该方法中,我需要了解要执行的结果查询的相关信息,例如:
- 谓词 (
s.FirstName == "Bill"
) - 选定的字段(来自
Students
表格,以及来自 的任何字段s.Grade
) 1
限制(在这种情况下是隐含的)- ... 等等。
AFAICT,Expression
在被调用IQueryable
时会转换为 SQL 查询(并执行) 。FirstOrDefault()
所以这种转变显然是可能的。但我想以结构化的方式检查数据,而不是检查 SQL 查询字符串。我希望我可以简单地检查可查询的 ( query.Limit < 0
),但这些约束的实际存储似乎隐藏在Expression
基于MethodCallExpression.cs
的源代码的对象 (?) 中的反射中。
解决方案
推荐阅读
- java - Hibernate:从单个表中获取所有记录,无论使用 @DiscriminatorValue 定义的类型如何
- javascript - string.split 由于某种原因无法正常工作
- html - 我在 CSS 中不断收到此错误,我不知道为什么
- c# - 拆分字符串但分隔符,仅在 [...] 对之外
- ios - 当用户更新单元格中的文本字段时更新数组
- java - 无法修改贝宝订阅
- python - 如何将不同列中的标记添加到 seaborn pandas barplot
- javascript - 如何在 .dmc 文件中对 JSON 对象进行分组?
- typescript - 特定时间的离子后台任务?
- java - 调用使用 CompletableFuture 的 thenAccept() 的方法