2012-03-21 39 views
3

想象我有一個實體:你如何劃分的LINQ表達式的屬性

MyEntity 
{ 
... 
Nullable<Int64> MyProperty 
... 
} 

我願做這樣的事情:

Ctx.MyEntity.Where(x=>x.MyProperty/16 == 10) 

與Linq.Expression

所以我創建了一個參數:

var param = Expression.parameter(typeOf(MyEntity)); 

然後屬性:

var prop = Expression.PropertyOrField(param,"MyProperty"); 

如果我想比較10我會做這樣的事情:

var cmp = Expression.equal(prop,Expression.constant(10,prop.Type)); 

但首先我需要通過16

所以道具劃分我嘗試:

var div = Expression.Divide(prop,Expression.constant(16, prop.type); 

而這拋出了一個不匹配類型的異常。

有人可以幫忙嗎?

THX,

+0

猜測:您需要訪問該Nullable的.Value。編譯器可能會在「這樣的事情」代碼中爲你做這件事。另一個想法是,在分割表達式創建中提供Int64類型(不是Nullable!) – 2012-03-21 16:01:35

回答

2

您需要創建區的表達是這樣的:

Expression.Divide(prop, Expression.Constant((Nullable<Int64>)16, prop.Type)) 

,有必要明確地將16鍵入財產,作爲文字使用的時候,因爲,它的類型Int32,顯然與Nullable<Int64>不一樣。

+0

您好!非常奇怪的是,如果我編寫Expression.Constant((Nullable )16),它將創建一個類型爲Int64的常量。你也許知道爲什麼? – 2012-03-21 16:17:30

+0

@Pit Ming Hm,這很有趣。我只能假設,當投射這樣的數字時,有一些優化可以通過編譯器(不太可能)或投射時完成。但我不太確定 - 可能會爲此創建一個單獨的問題。 – 2012-03-21 16:28:38

+0

@PitMing有沒有這樣的事情作爲一個常數可空。例如,你不能聲明'const long? x = 16L;'當你通過可空值時你爲什麼不會遇到類型錯誤?因爲沒有盒裝可以空的東西;當你將一個'Nullable '放入時,結果是一個盒子'T'。因此,在'Constant'方法的邏輯不能你已經通過一個可空''和一個普通的老'Int64'區分。 – phoog 2012-03-21 17:03:06

相關問題