2012-01-11 51 views
4

假設我有以下LambdaExpression:我可以使用LINQ Expressions參數化PropertyExpression的屬性名稱嗎?

我在Expression.Property(...)的工廠是一個參數需要的屬性名稱(第二個參數),我怎麼會去這樣做?

我希望看到一個構造函數看起來像這樣,但它不存在:

Expresssion.Property(Expression instance, Expression propName)

有一些技巧,我可以拉,可以參數化的常量表達式轉換成所需的字符串或的MemberInfo?也許我正在以這種錯誤的方式去做。

我的直覺是因爲這些表達式樹,在編譯時,成爲輕量IL,該成員訪問信息是必需的,因此,必須構建表達樹木時被提供成員和屬性的名稱。

感謝任何提示!

編輯:希望補充一點,這將用作Enumerable.Where(...)擴展方法的參數,用於確定兩個類/實體之間的關係的匹配。

+0

你有什麼計劃用所得的表達呢?您是否計劃將其發送給EF/LINQ2 ? – dasblinkenlight 2012-01-11 17:17:36

+0

實際上,它是用來解決通過用戶定義鍵的實體引用......但最終還是可以由IQueryable的提供商,我們必須加以利用。 :) – 2012-01-11 19:15:55

+0

完美的 - 在這種情況下,您的查詢提供可以尋找您的輔助函數(見我的回答如下),並相應地做它的魔力。我假定搜索由字符串名稱標識的屬性的功能已內置到您的查詢提供程序中。 – dasblinkenlight 2012-01-11 19:20:33

回答

2

表達式樹表示是您在C#/ VB.NET程序看到同一種大致 IL結構。你不能參數化該屬性表達出於同樣的原因,你不能「參數」下面的代碼:

var x = new MyClass {Id = 1, Name = "hello"}; 
var propName = "Id"; 
var xId = x.propName; // <-- This will not compile 

如果需要實現這個功能,你的表達式樹不傳遞給IQueryable<T>,你可以寫一個幫手函數接受一個對象和一個字符串,並返回由該字符串標識的該對象屬性的值;那麼你可以使用Expression.Call在你正在構建的表達式樹中調用這個輔助函數。

+0

這讓我在正確的方向思考。改變屬性訪問輔助方法調用的想法似乎是合理的。我想我可能要做的是根據影響屬性名稱的標準創建一個表達式緩存。在這種情況下,它是一種類型的關鍵查找。 (某些類型對於它們的鍵將具有不同的或甚至複合的屬性)。因此,對於給定的類型,我將創建執行比較所需的表達式。順便說一句,這最終會被傳遞給Enumerable.Where(...)分機的參數。方法。謝謝!!! – 2012-01-11 19:18:53

相關問題