簡體   English   中英

具有linq表達式的表達式樹

[英]Expression tree with linq expressions

我這周一直在玩表達式樹,我想知道為什么該表達式在運行時會產生錯誤。

var pe = Expression.Parameter(typeof(Nullable<DateTime>));

var ex = Expression.Lambda<Func<DateTime?, bool>>(
   (Expression<Func<DateTime?, bool>>) (x => x.HasValue), pe);

這背后的想法是使用表達式樹api和linq表達式混合編寫表達式樹。 例如,這將使編寫起來更容易,而不是調用Expression.Property(...,..)我將只有x => x.Prop ,對嗎?

在我的例子,而不是這個Expression.Property(..hasvalue..)我會有這樣的: x.HasValue 這樣可以節省我的寫作時間,而且看起來更短,對嗎?

問題是,這可能嗎?

我想我可能會缺少一些關於

Expression<Func<DateTime?, bool>> foo = x => x.HasValue (this works)

Func<DateTime?, bool> bar = x => x.HasValue (this works too)

這兩個背后發生了什么? 他們是一樣的嗎?

LINQ表達式可以與標准表達式樹API混合嗎???

請對此給予啟發,我感到迷茫。 :)

這是一個很好的問題。 您的兩個報價

Expression<Func<DateTime?, bool>> foo = x => x.HasValue

Func<DateTime?, bool> bar = x => x.HasValue

同像性的例子:同一符號(在你的情況下,x => x.HasValue)代表兩個非常不同的對象。 在第一種情況下,它表示一個表達式樹。 第二,一個功能。 前者可以簡化為后者,但它們是具有不同用途的不同類型。 您的情況下的聲明會告訴編譯器要使用哪個版本。 在沒有此上下文的情況下,編譯器無法理解您的想法,而是決定紓困。 這就是為什么它將無法編譯的原因:

var bat = x => x.HasValue;

這就是為什么您的陳述無法編譯的原因。

同質性使IQueryableIEnumerable看起來如此相似。 調用時

var filteredCollection = myCollection.Where(e => e.IsActive);

您實際上是根據filteredCollection的類型調用具有不同簽名的方法(對於IEnumerableFunc<MyClass, bool> ,對於IQueryable Expression<Func<MyClass, bool>> )。

關於您的具體情況,您無法直接實現您想做的事情,但是如果您編寫了一個偷偷摸摸的擴展方法:

public static class ExpressionExtensions
{
    public static Expression<Func<T, TProperty>> Lambda<T, TProperty>(this ParameterExpression pe, Expression<Func<T, TProperty>> property)
    {
        return Expression.Lambda<Func<T, TProperty>>(property, pe);
    }
}

那么您可以執行以下操作:

var pe = Expression.Parameter(typeof(DateTime?));
var ex = pe.Lambda<DateTime?, bool>(x => x.HasValue);

暫無
暫無

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

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