c# - 确定 MemberExpressions 目标的范围

标签 c# .net linq expression-trees custom-linq-providers

这里有人有编写自定义 Linq 提供程序的经验吗?

我想要做的是判断作为业务对象属性的 MemberExpression 是否应该包含在 SQL 中,或者是否应将其视为常量,因为它来自恰好是业务对象的局部变量.

例如,如果你有这个:

Customer c = LoadCustomerFromDatabase();

var orders = from o in db.Orders() where o.CustomerID == c.CustomerID select o;

目前,我的查询翻译器将尝试执行SELECT * FROM order o where o.CustomerID = c.CustomerID,这当然不起作用。

我想要做的是检查 c.CustomerID 上的 MemberExpression 并尝试确定它是否是局部变量,或者只是用作 Linq 表达式的一部分。

我已经设法将其作为第二次查询,查找 SQL Server 无法绑定(bind)的字段,并注入(inject)它们的值,但如果可能的话,我希望这一切都发生在同一时间。我尝试查看表达式 Type 属性和 IsAutoClass,但这只是猜测,因为它包含单词 Auto。但它不起作用:)

最佳答案

好吧,我不知道您是否可以将其减少到一次,但是您可以获得有关该成员的信息,以及它是否与您声明为查询一部分的另一个变量一致(在本例中为“o"),您可以使用它来生成查询。

否则,您会假设它是一个常量,然后插入该值。

不幸的是,由于您可以在查询中的多个位置使用 from 语句(除了 let 语句之外),因此您似乎无法一次性完成它,因为您需要了解所有查询前面的变量。

关于c# - 确定 MemberExpressions 目标的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456383/

相关文章:

c# - 使用 WebClient 在 Unity3d 中下载大文件

c# - 将变量值和输出从 PL/SQL 代码块返回到 C#

c# - 如何首先使用带有 EF 代码的可重用查询/表达式来获取子实体作为父级中的 DTO?

C# LINQ - 在两个属性之间的列表中查找对象

c# - 如何使方法接收两种不同的数据类型并仅返回其中一种 C#?

c# - 如何阻止 VisualStudio 项目中的编码人员使用 DateTime.parse()?

c# - Unity3d C++ 插件

.NET 提交与保留堆大小

.net - 为什么我不能在对象成员中使用一次性对象?

c# - 如何对长 LINQ 链中可枚举的每一项进行断言