2017-08-04 38 views
0

我在堆棧上看到一些相關問題,但不知道如何仍然解決問題,因爲我正在執行三個表左外連接。 RoleUserRole是一個實體對象實體或複雜類型''不能在LINQ to Entities查詢中構建,三個表外連接

var query = from u in Context.Users 
      join ru in Context.RoleUsers on u.Id equals ru.UserId into plv 
      from x in plv.DefaultIfEmpty(new RoleUser()) 
      join r in Context.Roles on x.RoleId equals r.Id into pii 
      from y in pii.DefaultIfEmpty(new Role()) 
      orderby u.Id, y.Id 
      select new UserWithRole() { Id = u.Id, User = u, Role = y }; 
+0

哪種類型你明白它? 'UserWithRole''RoleUser'或'Role' –

+0

使用參數'DefaultIfEmpty()'。您正在使用的重載不受支持。 –

+0

@IvanStoev當RoleUser或Role的值爲空時我得到一個空引用錯誤 –

回答

1

由於錯誤解釋,你不能在他們映射類型(RoleUserRole)LINQ查詢創建。請使用DefaultIfEmpty()。沿着下面的內容:

var roles = from ru in Context.RoleUsers 
      join r in Context.Roles on ru.RoleId equals r.Id 
      select new { ru.UserId, role = r }; 

var query = from u in Context.Users 
      join r in roles on u.Id equals r.UserId into plv 
      from x in plv.DefaultIfEmpty() 
      select new UserWithRole() { Id = u.Id, User = u, Role = x.role }; 

不過我建議你看看到導航性能 - 這樣你就不必構建連接和使用它,就好像它是「正常」的對象。

+0

@Mo Ahmad - 下面是否給出空引用? –

+0

實際上我無法得到這個編譯\t'不能隱式轉換類型'<匿名類型:int UserId,System.Collections.Generic.IEnumerable 角色>'到'Server.Database.Role'' –

+0

@MoAhmad - 真的 - 我犯了一個錯誤 - 現在怎麼樣? –

1

問題是DefaultIfEmpty(new RoleUser())DefaultIfEmpty(new Role())調用,因爲EF無法將創建常量實體對象轉換爲SQL。

因此,您需要使用DefaultIfEmpty()的無參數超載,並在物化查詢結果中處理null對象。

如果您不需要IQueryable<T>結果,您可以通過使用AsEnumerable()使用中間匿名類型的投影,這在LINQ到對象上下文並做最後的期望投射:

var query = (from u in Context.Users 
      join ru in Context.RoleUsers on u.Id equals ru.UserId into userRoles 
      from ru in userRoles.DefaultIfEmpty() 
      join r in Context.Roles on ru.RoleId equals r.Id into roles 
      from r in roles.DefaultIfEmpty() 
      orderby u.Id, r.Id 
      select new { User = u, Role = r } 
      ) 
      .AsEnumerable() // db query ends here 
      .Select(x => new UserWithRole 
      { 
       Id = x.User.Id, 
       User = x.User, 
       Role = x.Role ?? new Role() // now this is supported 
      }); 
+0

這似乎在大多數情況下工作,但我不明白爲什麼這個查詢失敗的情況下,用戶,沒有角色,沒有roleuser ...它應該仍然返回一個用戶,但它返回null。 –

相關問題