我从UnaryExpression.Operand得到什么?

时间:2019-01-27 14:11:48

标签: c# expression

我正在阅读有关如何building an IQueryable Provider的代码

下面是代码片段

<uses-permission android:name="android.permission.INTERNET" />

我无法理解StripQuotes方法,我从e =(((UnaryExpression)e).Operand?

1 个答案:

答案 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; }
    }
}

https://sharplab.io/#v2:CYLg1APgAgDABFAjAbgLAChYMQOgDICWAdgI5roZQDMCATHAMJwDeGc7CNUALHALK0AFAEoWbDhIBuAQwBOcEgFcAprICecALziJuuEWUB3OAGUA9gFtlDADbSAzvYDaMALo69HHAEF7ARRV1aQAjG2URD084HAB1AAtVcIAPLQA+OCSccysGMxswgGMAFwIzIh8iNUENTXSNAFI4ek1NOBhhYXIJAF8PJAA2OGCzPLgAMUEkfGISHABRJIAHWWVHUqJ7eaWVtbKAHigAVj3iIoAaIZGbVPTlUWYEAHY4ItkVZDhe9Ak++mzrOyOMTfTzUOAASQCqjUITCJyIRXS/1y+WUxXWLDgAHNlEUPvZcR8vj0MF8gA