2010-09-21 133 views
3

鑑於以下代碼:LINQ的投影內使用方法

 var EmployeeXPosition = from emp in context.WTDEmployee 
           from ep in emp.WTDEmployeeXOXPosition 
           select new { 
            EmployeeId = emp.id, 
            FullNameAndPosition = string.Format("{0} {1} : {2}", emp.FirstName, emp.LastName, ep.WTDPosition.Position) 
           }; 

它給出了錯誤:

LINQ實體無法識別 方法「System.String 格式(System.String ,System.Object, System.Object,System.Object)'方法, ,並且此方法不能將 轉換爲存儲表達式。果然

我可以這樣做:

emp.FirstName+" "+ emp.LastName +" : " + ep.WTDPosition.Position 

但它只是看起來醜陋,如何使用string.Format,而不是有什麼建議?

回答

5

我通常通過創建兩個語句來解決這個問題 - 一個在LinqToEntities(或ToSql或其他)中,另一個在LinqToObjects中。我在商店中做我需要做的事情,然後對內存中的對象執行單獨的處理步驟。這混合了兩全其美。

var EmployeeXPosition = from emp in context.WTDEmployee 
           from ep in emp.WTDEmployeeXOXPosition 
           select new { 
            emp.id, 
            emp.FirstName, 
            emp.LastName, 
            ep.WTDPosition.Position 
           }; 

var result = from item in EmployeeXPosition.ToList() 
      select new 
      { 
       EmployeeId = item.id, 
       FullNameAndPosition = string.Format("{0} {1} : {2}", item.FirstName, item.LastName, item.Position) 
      }; 
1

This codeplex project聲稱做你想要的。 不幸的是我現在沒有時間去嘗試它 - 但在這裏就是他們說

LINQ表達投影庫提供工具,使使用LINQ預測 lambda表達式(匿名和預定義 類型),即使lambda表達式在查詢中沒有定義,但 而是存儲在變量中或通過函數或 屬性檢索。