[英]Linq Expressions -> Build a Where(…).Single(…) Linq Tree Expression
[英]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;
這就是為什么您的陳述無法編譯的原因。
同質性使IQueryable
和IEnumerable
看起來如此相似。 調用時
var filteredCollection = myCollection.Where(e => e.IsActive);
您實際上是根據filteredCollection
的類型調用具有不同簽名的方法(對於IEnumerable
是Func<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.