2012-04-11 19 views
2

我從字符串中創建基於Lambda的Linq表達式時遇到了一些困難。下面是我用這個樣本對象/類的基本情況:如何從C#中的字符串創建基於動態lambda的Linq表達式?

public class MockClass 
{ 
    public string CreateBy { get; set; } 
} 

基本上我需要一個像這樣的字符串轉換:

string stringToConvert = 「x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase」; 

進入一個以謂詞/ LINQ表達式:

System.Linq.Expressions.Expression<Func<T, bool>> or in this example 
System.Linq.Expressions.Expression<Func<MockClass, bool>> 

因此它相當於下面Where方法中的Linq表達式:

query = query.Where(x => x.CreateBy.Equals(filter.Value, 
StringComparison.OrdinalIgnoreCase)); 

我試過使用下面的助手,但似乎無法弄清楚如何讓他們在這種類型的情況下工作,我想能夠建立一個linq表達式從字符串,不知道提前: http://www.albahari.com/nutshell/predicatebuilder.aspx

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx(它現在可以作爲NuGet包以及被稱爲「DynamicQuery」)

+5

爲什麼要將表達式放在字符串中?用戶是否輸入該表達式?將它保存在適當的類型中。 – 2012-04-11 22:28:13

+0

非開發人員用戶正在動態地輸入查詢語法,該查詢語法與在查詢字符串中傳遞的搜索語法相似,然後需要最終完成所有這些操作,例如,當它可以是大量類型和嵌套類型的任何屬性或子屬性時,獲取正確的類型會更困難。 – jon333 2012-04-12 21:51:54

回答

1

類似的問題在這裏問:

Is there an easy way to parse a (lambda expression) string into an Action delegate?

據我所知,這個「動態查詢」實際上是一個框架,用於在不使用lambda表達式的情況下傳遞Where子句的限制。

這意味着lambda表達式不是動態方法,它們是匿名方法。如果你曾經在程序集中看過,你會發現你的lambda表達式被轉換成任何自由變量作爲字段的閉包。該類有一個簽名匹配你的方法,字段變量是在調用點分配的。

想到這個問題的一個好方法是,它意味着你的lambda表達式在編譯時被c#編譯器解釋,並且變量通過在運行時從這個類實例化對象來解決。

爲了證明這一點,考慮以下因素:

var myLambda = x => x * x 

你會發現這是行不通的。這是因爲,爲了創建相關的類/方法,編譯器必須在編譯時知道x的類型。

所有這些都很重要,因爲lambda表達式的概念在運行時並不存在於CLR中(與代碼中的形式相同)。一個看起來像lambda表達式的字符串正是這樣的...

+0

這適用於使用動態Linq庫的頂級屬性,但我無法獲取子屬性或子集合以替代。 var test = string.Format(「{0} == {1}」,propertyName,value); var e = DynamicExpression.ParseLambda (測試);我希望我能得到這樣的翻譯:query = query.Where( x => x.MockClass.SubCollection.Any(y => y.Name.StartsWith(filter.Value))); – jon333 2012-04-13 15:01:30

相關問題