2014-10-03 63 views
0

以下作品查詢:兩個看似相同的LINQ查詢。一件作品,其他沒有

var result = (from p in db.Permissions 
       join z in db.PermissionOverridesByUsers on p.id equals z.PermissionID into x 
       from y in x.DefaultIfEmpty() 
       where userRoleIds.Contains((Guid)(p.ParentRoleID)) 
       select new RolePermissionViewModel 
         { 
          id = p.id, 
          Name = p.Name, 
          IsSet = ((y.id != null && y.id > 0) ? false : true) 
         }).ToList(); // If an exception exists, IsSet = false, otherwise = true.       

這一項上IsSet

var query1 = (from p in db.Permissions 
       where userRoleIds.Contains((Guid)(p.ParentRoleID)) 
       select p).ToList(); 

var query2 = (from ov in db.PermissionOverridesByUsers 
       where ov.AffectedUserID == id 
       select ov).ToList(); 

var result = (from q1 in query1 
       join z in query2 on q1.id equals z.PermissionID into x 
       from y in x.DefaultIfEmpty() 
       select new RolePermissionViewModel 
         { 
          id = q1.id, 
          Name = q1.Name, 
          IsSet = ((y.id != null && y.id > 0) ? false : true) 
         }).ToList(); 

產生一個空引用錯誤我在做什麼錯?我怎樣才能讓第二個結果工作?

回答

1

您的第一個查詢由查詢提供程序解釋,以生成適當的查詢以返回請求的結果。對查詢提供者來說,構造join ... into x from y in x.DefaultIfEmpty()是生成左外連接的標誌。隨着實體的實現,提供者將識別NULL值以及對應給定類型的相應默認值。這些默認值是評估涉及它們的表達式時使用的。

但是,當您將所有結果拖到列表中時,您的第二個查詢將被拉入到LINQ to Objects中。現在查詢這些列表受制於常規的C#規則。現在,x.DefaultIfEmpty()部分現在將生成一個作爲集合類型默認值的項目的集合。在參考類型的情況下,這意味着null。您需要提供替代(非空)值才能使用。默認實例通常就足夠了。

var result = 
    (from q1 in query1 
    join z in query2 on q1.id equals z.PermissionID into x 
    from y in x.DefaultIfEmpty(new PermissionOverridesByUsers()) 
    select new RolePermissionViewModel 
    { 
     id = q1.id, 
     Name = q1.Name, 
     IsSet = ((y.id != null && y.id > 0) ? false : true) 
    }).ToList(); 
+0

工作很好。非常感謝你! – Ryan 2014-10-03 01:51:51

相關問題