2010-07-15 78 views
3

我有一個將一種類型的對象轉換爲另一種類型的表達式。表達式如下:在Linq select子句中重用表達式(查詢格式)

public Expression<Func<SQLRepository.ActionType, Model.ActionType>> DBActionTypeToActionType = 
(SQLRepository.ActionType at) => new Model.ActionType() 
{ 
    ID = at.OID, 
    DisplayName = at.DisplayName 
}; 

我可以用這樣的表達:

var linq = (from at in dc.SQLRepositoryDC.ActionTypes select at).Select(DBActionTypeToActionType); 

但我想用這樣的:

var linq = (from at in dc.SQLRepositoryDC.ActionTypes select DBActionTypeToActionType.Compile().Invoke(at)); 

我一直現在尋找幾天,我只能在Where子句中找到這樣做的參考。看來,如果我能夠使用函數調用來做到這一點,應該可以使用查詢語法。

使用查詢語法很重要的原因是,某些正在被選中的對象是由許多子對象組成的,並試圖將所有轉換鏈接在一起,並且函數符號會更加困難編寫和維護。

回答

4

看來,如果我能夠使用函數調用來做到這一點,應該可以使用查詢語法。

這是不正確的。查詢符號總是通過lambda表達式。例如

from x in y select z 

最終成爲

y.Select(x => z) 

這意味着,如果你已經得到了你想要直接作爲參數傳遞給Select表達式目錄樹,您不能使用查詢表達式,因爲有這種額外的間接水平。

現在可用的選項取決於您需要應用預定義表達式的位置。您可以隨時用它的來源,然後與查詢繼續:

var query = from foo in dc.ActionTypes.Select(DBActionTypeToActionType) 
      where foo.Stuff 
      select foo.Other; 

或將其在年底很簡單:

var query = (from bar in dc.ActionTypes 
      where bar.Stuff 
      select bar).Select(DBActionTypeToActionType); 

是否幫助呢?

+0

是的,這有很大的幫助。我沒有考慮將select函數應用到_BEFORE_表中,我在收集所有數據之後試圖做到這一點。 非常感謝。 – 2010-07-15 21:14:46