2012-08-15 87 views
1

我有以下lambda表達式C#拉姆達的身體串

var expr = a => (a.Name == "Alex" && a.DateCreated < DateTime.Now.AddHours(2)) 

我想用運行時值表達身體的字符串,如果我叫expr.Body.ToString()我得到以下字符串作爲回報。

{((a.Name == "Alex") AndAlso (a.DateCreated < DateTime.Now.AddHours(2)))} 

所以我只想澄清我有望獲得DateTime.Now.AddHours(2)的值。我一直在花費過去的幾個晚上在沒有任何結果的情況下瘋狂搜索網頁。這可能歸結於我不知道要搜索什麼。希望你們將能夠幫助:)

+2

*爲什麼*您希望得到'DateTime.Now.AddHours(2)'的價值? – 2012-08-15 16:55:28

+0

不知道我是否期待或希望,但我的目標是獲得DateTime.Now.AddHours(2)的實際價值。 – 2012-08-15 17:02:08

回答

2

你需要遷出拉姆達的日期時間電話:

DateTime endDate = DateTime.Now.AddHours(2); 
Expression<Func<YourClass, bool>> expr = a => (a.Name == "Alex" && a.DateCreated < endDate); 

即使是這樣,你會表現出表達關閉,而不是值。

爲了得到一個特定的日期作爲印刷值,你需要一個常數,即:

Expression<Func<YourClass, bool>> expr = a => (a.Name == "Alex" && a.DateCreated < DateTime.Parse("10/2/2012")); 

這將顯示DateTime.Parse電話,但至少仍顯示值(因爲它是在一個恆定表達式。)

當您構建表達式時,DateTime屬性和方法(NowAddHours)成爲表達式本身的一部分。這也發生在關閉變量上。該表達式必須包含構建完整lambda所需的所有語句,包括DateTime.Now.AddHours(2)

這是由設計 - DateTime.Now.AddHours()需要在服務器上解決,如果你把它變成一個實體框架查詢,例如,AddHours is one of the Canonical Functions。如果這是一個常數交換出來,它不會像預期的那樣。

+0

現在它給了我「值(Test.Program +()c_DisplayClass0).date」。當然,必須有一種方法來獲取DateTime的實際值,而不是變量的名稱。 是的,那種限制了我希望對此做的事情。 – 2012-08-15 17:03:30

+0

@AlexanderHansen Nope - 我剛剛再次編輯,解釋它爲什麼是這種方式... – 2012-08-15 17:06:38

+0

好吧,我將不得不重新考慮我的解決方案,我想,非常感謝您對此的快速回復:) – 2012-08-15 17:09:18

0

下面的代碼有效,但我不確定你是否真的想要使用它。

Expression<Func<A,bool>> expr = a => (a.Name == "Alex" && a.DateCreated < DateTime.Now.AddHours(2)); 

var expr1 = expr.Body as BinaryExpression; 
var expr2 = expr1.Right as BinaryExpression; //a.DateCreated < DateTime.Now.AddHours(2) 
var expr3 = expr2.Right as MethodCallExpression; //DateTime.Now.AddHours(2) 

var obj = expr3.Object as MemberExpression; //DateTime.Now 
var pi = obj.Member as PropertyInfo; 
var dt = pi.GetValue(null); //Call DateTime.Now 


var arg = expr3.Arguments[0] as ConstantExpression; 
var result = expr3.Method.Invoke(dt, new object[] { arg.Value }); //Call AddHours 

-

public class A 
{ 
    public string Name { set; get; } 
    public DateTime DateCreated { set; get; } 
} 
+0

是的,似乎工作得很好。但是,再一次,它將不再適用於更復雜的表達式。但是,非常感謝,這可能只是指向了正確的方向:) – 2012-08-15 17:45:28