2011-12-16 84 views
1

我有兩個表。實體框架 - 合併兩行數據

Orders 
OrderID | UserID | OrderTotal 
1  | 1 | 100 
2  | 2 | 110 
3  | 1 | 120 

Users 
UserId | ProprtyType | PropertyValue 
1  |  1  | Kevin 
1  |  2  | Nolan 
1  |  1  | FirstName 
1  |  2  | Surname 

使用下面的查詢

var query = from orders in context.Orders 
join users in context.Users on orders.UserID equals user.UserID 
where userData.Type == 211 || userData.Type == 212 

1  | 1 | 100 | Kevin 
1  | 1 | 100 | Nolan 
2  | 2 | 110 | FirstName 
2  | 2 | 110 | Surname 
3  | 1 | 120 | Kevin 
3  | 1 | 120 | Nolan 

是在實體框架的工作有可能因此它返回以下

1  | 1 | 100 | Kevin  | Nolan 
2  | 2 | 110 | FirstName | Surname 
3  | 1 | 120 | Kevin  | Nolan 

或者

1  | 1 | 100 | Kevin Nolan 
2  | 2 | 110 | FirstName Surname 
3  | 1 | 120 | Kevin Nolan 

得益於結果合併

回答

3

用戶表是真的很糟糕的設計,國際海事組織。如果保留表格佈局,請將其重命名爲UserProperties。此外,您的示例代碼與您的表格佈局或建議的結果不匹配。

話雖這麼說,你可以做這樣的事情:關於實體框架

var firstnames = from user in context.Users 
       where user.PropertyType == 1 
       select new { Id = user.UserID, 
           Firstname = user.PropertyValue }; 

var lastnames = from user in context.Users 
       where user.PropertyType == 2 
       select new { Id = user.UserID, 
          Lastname = user.PropertyValue }; 

var users = from fn in firstnames 
      join ln in lastnames on fn.Id equals ln.Id 
      select new { Id = fn.Id, 
         Firstname = fn.Firstname, 
         Lastname = ln.Lastname }; 

var query = from order in context.Orders 
      join user in users on order.UserID equals user.Id 
      select new { /*what you need to select*/ }; 

一個好處是,實際的SQL查詢,只要有可能推遲。因此,查詢名字和姓氏不會生成數據庫連接。那會晚一點。不幸的是,你的餐桌設計使得利用EF的這些好處變得非常困難。

+0

+1,imo會更清楚地將它們組合成單個查詢。 – 2011-12-16 14:43:07

1

同意atornblad的回答,但只是想指出,你不需要依靠延遲執行來獲取名字和姓氏。您可以加入同一個表兩次,類似於您在SQL查詢中多次加入表的方式:

var query = from o in Orders 
      join fn in Users on o.UserId equals fn.UserId 
      join ln in Users on fn.UserId equals ln.UserId 
      where fn.PropertyType == 1 && ln.PropertyType == 2 
      select new 
      { 
       OrderId = o.OrderId, 
       UserId = fn.UserId, 
       Total = o.OrderTotal, 
       FirstName = fn.PropertyValue, 
       LastName = ln.PropertyValue 
      };