我正在阅读有关如何building an IQueryable Provider的代码
下面是代码片段
<uses-permission android:name="android.permission.INTERNET" />
我无法理解StripQuotes方法,我从e =(((UnaryExpression)e).Operand?
答案 0 :(得分:1)
What does Expression.Quote() do that Expression.Constant() can’t already do?解释了Quote
的作用。
现在的问题是,LINQ提供程序在实际情况下何时会遇到Quote
操作。当您调用以表达式树为参数的IQueryable
操作时,它会出现。例如,bool Queryable.Where(IQueryable inputQuery, Expression<Func<..., bool>> predicate)
使用一个表达式树。
如果您说myQueryable.Where(x => ...)
,则C#编译器将生成Expression.*
调用以构建该表达式树并将其传递给Where
。这里没有Quote
。
但是,如果表达式树的生成是 nested ,则使用Quote
:
myQueryable.Where(x => x.SomeCollection.Any(y => ...))
这里,y => ...
部分的类型为Expression<..., bool>
。这需要Quote
。
我相信一个简单的LINQ提供程序可以打开/丢弃Quote
并生成代码,就好像它不存在一样。如果您想完全正确,则需要在LINQ提供程序中对该情况进行特殊处理。问题中的LINQ提供程序代码是“演示代码”质量,因此不能这样做。
您可以使用https://sharplab.io/
来处理各种查询,以查看编译器生成的内容。例如。
using System;
using System.Linq;
public class C {
public void M2() {
var query =
new SomeClass[0]
.AsQueryable()
.Where(x => x.SomeCollection.Any(y => y % 2 == 0));
}
static bool F(System.Linq.Expressions.Expression<Func<int, bool>> e) { return true; }
class SomeClass {
public IQueryable<int> SomeCollection { get; set; }
}
}