簡體   English   中英

.NET LINQ IQueryable:“表達式”的作用是什么?

[英].NET LINQ IQueryable: what is `Expression` for?

我正在使用LINQ提供程序,因此正在實現IQueryable。

此接口中Expression屬性的目的是什么? 我通常只是從實現中返回類似Expression.Constant(this)類的東西,但是不知道這是否不好。

文檔奇怪地指出:“這允許框架區分LINQ查詢和Entity SQL查詢”。

IQueryable.Expression部件被反饋到IQueryProvider所有的各種Queryable.*經營者”( .Where() .Select() .Join() ,...),如:

public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) {
    if (source == null)
        throw Error.ArgumentNull("source");
    if (predicate == null)
        throw Error.ArgumentNull("predicate");
    return source.Provider.CreateQuery<TSource>( 
        Expression.Call(
            null,
            ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)), 
            new Expression[] { source.Expression, Expression.Quote(predicate) }
            ));
}

(摘自參考源

通常,它應該是整個表達式。

顯然,如果您通過Expression.Constant()直接傳遞對IQueryable類的完整引用,沒有人會殺了您,但是我確實認為這不是“粗俗”。

將“真實”表達式放入Expression (就像由Enumerable.AsQueryable() ,EF和LINQ-to-SQL來完成,僅舉三個IQueryable提供程序一樣)的目的是,其他外部類可以自由地分析和以與Queryable.Where相同的方式操作Expression並將其反饋給提供者

Expression expression = source.Expression;
// here "expression" is manipulated
return source.Provider.CreateQuery<SomeType>(expression);

舉個例子...有一些“查詢修復程序”可以修改查詢,例如https://github.com/davidfowl/QueryInterceptor (查詢的通用修飾符)或https://github.com/hazzik/ DelegateDecompiler ,它允許執行以下操作:

var employees = (from employee in db.Employees
                 where employee.FullName == "Test User"
                 select employee).Decompile().ToList();

FullName 不在數據庫中映射,並且是類似以下屬性的屬性:

class Employee
{
    [Computed]
    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }

(將FirstNameLastName映射到數據庫)。 DelegateDecompilerIQueryable獲取Expression ,搜索具有Computed屬性的屬性,對其進行反編譯,然后將反編譯的代碼(轉換為表達式樹)放回到IQueryable.Expression (盡管使用IQueryable.Provider.CreateQuery()

如果要保存其他數據,可以將其放在Provider :可以在CreateQuery方法中生成IQueryProvider類的新實例。 也是由Queryable.*運算符反饋的(因為CreateQuery<>source.Provider的實例方法)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM