2012-11-24 23 views
2

我想在LINQ表達式變換字符串 「Employee.Orders.OrderID」: 「employee.Orders.Select(爲了=> order.OrderID)」。如何從字符串創建屬性(集合)表達式選擇器?

我已經知道如何在簡單的屬性如「Employee.FirstName」中做到這一點我的問題是如何在集合中的類型內的屬性做到這一點。

「訂單」是類「員工」中訂單的集合。 「OrderID」是類「Order」的屬性。

換句話說,我想改變這個;

string path = "Employee.Orders.OrderID"; 

進入此;

Expression<Func<Employee, object>> exp = employee => employee.Orders.Select(order => order.OrderID); 

回答

1

這應該做的伎倆:

https://gist.github.com/4149424

我沒有編譯生成的表達,但它建立的表達沒有異常。

編輯:我已經添加了一行來創建lambda並將其編譯,它也這樣做,所以它工作。

它處理您訪問集合Orders.OrderID屬性的場景,這是使它變得複雜的部分。沒有它,它會縮短大約30行。

目前,它所做的是將字符串拆分爲'。'。然後遞歸處理每個元素。如果元素是IEnumerable(但不是字符串),則它會生成另一個Select lambda。

它還處理稍微更復雜(但更多相同)場景,您可以訪問集合屬性中的集合屬性。

+0

我還沒有時間測試,但是非常好,謝謝。 我會在幾個小時內做一些測試,如果能確認您的答案,請回到這裏。 – Lukian

+0

所以我回到這裏感謝你的幫助,你的回答完美無缺。 如果您或任何人想了解更多有關該項目的信息,請參閱http://tgh.codeplex.com/ – Lukian

+0

您可以幫助開源項目變得更好:很高興能幫助您:)項目祝您好運!我有一個類似ish項目(https://github.com/JulianR/ThisMember/wiki類似於Automapper比你的庫更類似),它用表達式做了很多事情,因此我知道這一點。 – JulianR

相關問題