2012-02-09 40 views
0

我試圖創建一個顯示僱員列表的頁面。錯誤獲取會員數據返回多個項目

所有員工的認證數據存儲在.NET會員表,與像存儲在相關的表名爲Employees名稱等數據。

這裏是我的代碼,是讓員工的名單:

var viewModel = employees.OrderBy(e => e.Name). 
          Select(e => new EmployeeViewModel 
          { 
           EmployeeId = e.EmployeeID, 
           Name = e.Name, 
           Email = Membership.GetUser(e.UserID).Email, 
           Active = e.Active 
          }); 

我得到這個錯誤:

LINQ to Entities does not recognize the method 'System.Web.Security.MembershipUser GetUser(System.Object)' method, and this method cannot be translated into a store expression.

我做了一些研究,發現我需要外拉Membership.GetUser功能的LINQ表達式。如果我只得到一名員工,這很好,但我要返回一個列表,所以用戶在每次迭代時都會有所不同。

任何人都知道我是如何解決這個問題?

回答

2

您可以評估你的選擇的「客戶」方面與Select(..)之前插入ToArray()

var viewModel = employees.OrderBy(e => e.Name) 
          .ToArray() 
          .Select(e => new EmployeeViewModel 
          { 
           EmployeeId = e.EmployeeID, 
           Name = e.Name, 
           Email = Membership.GetUser(e.UserID).Email, 
           Active = e.Active 
          }); 

在這種情況下EF不要試着翻譯Membership.GetUser方法。

編輯: 正如評論中指出的那樣,這個解決方案雖然解決了你的問題,但又引入了另一個:它會執行N + 1選擇,其中N是員工數。

爲了避免您可以將您的MemberShip表映射到EF模型中,並且可以在MemberShipEmployee表之間創建關係。然後,您可以通過一次選擇獲取所有數據,而無需使用Membership.GetUser()

+1

或者,如果僱員表是在相同的數據庫中aspnet_Membership表,您可以創建它們之間的聯繫,讓您使用類似e.Membership.Email(你必須在創建一個用戶ID字段中輸入您Employee表及相應的GUID加載到其中,然後將會員表添加到您的.edmx文件) – Dave 2012-02-09 20:15:55

+0

如果有N個員工,建議的Linq會導致N + 1次的數據庫查詢,不是嗎?這不會擴大到大量的員工,當然? @Dave在DB(以及模型)級別創建鏈接的建議將允許一個SQL查詢。 – 2012-02-09 20:21:34

+0

你們都是對的。我專注於快速修復並錯過了選擇的N + 1。我已經更新了我的答案。 – nemesv 2012-02-09 20:35:10