2012-10-07 38 views
0

我試圖使用實體做到這一點:實體框架:DbIsNullExpression的參數必須是指在原始或引用類型

SELECT * 
    FROM aspnet_Users u LEFT JOIN (SELECT u.UserId, p.Permission, p.MediaId, p.Valid 
         FROM aspnet_Users u LEFT JOIN Permission p ON u.UserId = p.UserId 
         WHERE p.MediaId = 57 AND p.Valid = 1 
         ) B 
         ON u.UserId = B.UserId 

下面是C#代碼:

var up = from u in en.aspnet_Users 
     join p in en.Permissions 
     on u.UserId equals p.UserId into pu 
     from p2 in pu.DefaultIfEmpty() 
     where p2.MediaId == this.MediaId && p2.Valid == true 
     select new 
     { 
     u.UserId, 
     p2.PermissionId, 
     p2.Permission1, 
     p2.MediaId, 
     p2.Valid 
     }; 

    var ul = from us in en.aspnet_Users 
     join pm in up 
      on us.UserId equals pm.UserId into pm1 
     from pm2 in pm1.DefaultIfEmpty() 
     orderby us.LoweredUserName 
     select new PermissionInfo { 
      Permission = (pm2 == null ? -1 : pm2.Permission1), 
      UserName = us.UserName, 
      UserId = us.UserId, 
      PermissionId = (pm2 == null ? -1 : pm2.PermissionId) }; 
    ret = ul.ToList(); 

然而,在最後一行發現錯誤

DbIsNullExpression的參數必須引用原語或引用類型。

任何人都知道如何解決這個問題?謝謝。

編輯回答1點建議:

var up = from u in en.aspnet_Users 
        join p in en.Permissions 
         on u.UserId equals p.UserId into pu 
        from p2 in pu.DefaultIfEmpty() 
        where p2.MediaId == this.MediaId && p2.Valid == true 
        select new {u, p2}; 

      var ul = from us in en.aspnet_Users 
        join pm in up 
          on us.UserId equals pm.u.UserId into pm1 
        from pm2 in pm1.DefaultIfEmpty() 
        orderby us.LoweredUserName 
        select new PermissionInfo 
        { 
         Permission = (pm2 == null ? -1 : pm2.p2.Permission1), 
         UserName = us.UserName, 
         UserId = us.UserId, 
         PermissionId = (pm2 == null ? -1 : pm2.p2.PermissionId) 
        }; 

      ret = ul.ToList(); 
+0

感謝您的建議。 它做的是:它有2個表,用戶和權限。對於不同媒體ID的用戶,權限具有權限值。但它沒有列出所有用戶的所有媒體ID的權限。我需要爲所有用戶提供一個列表。如果用戶處於權限中,請列出其值。如果用戶不在Permission中,則列表爲-1。這就是爲什麼它有兩個左連接。 SQL很簡單,實體查詢也很簡單。 再次感謝。 – urlreader

回答

0

我認識到,由於在第二查詢時,它仍然有左與aspnet_Users表格內加入,它並不需要具有u在第一查詢,所以我將其更改爲以下,現在可以使用。但是,仍然會很高興知道原始代碼和建議代碼失敗的原因。

var up = from u in en.aspnet_Users 
        join p in en.Permissions 
         on u.UserId equals p.UserId into pu 
        from p2 in pu.DefaultIfEmpty() 
        where p2.MediaId == this.MediaId && p2.Valid == true 
        select p2; 

      var ul = from us in en.aspnet_Users 
        join pm in up 
          on us.UserId equals pm.UserId into pm1 
        from pm2 in pm1.DefaultIfEmpty() 
        orderby us.LoweredUserName 
        select new PermissionInfo 
        { 
         Permission = (pm2 == null ? -1 : pm2.Permission1), 
         UserName = us.UserName, 
         UserId = us.UserId, 
         PermissionId = (pm2 == null ? -1 : pm2.PermissionId) 
        }; 

      ret = ul.ToList(); 
1

有一個類似的問題,我設法通過移動SQL以外的空檢查解決它。你的情況,你可以通過檢查Null之前調用ToList()做到這一點:

var intermediateUl = from us in en.aspnet_Users 
    join pm in up 
     on us.UserId equals pm.UserId into pmOuter 
    from pm2 in pmOuter.DefaultIfEmpty() 
    select new { us.UserName, us.UserId, pm2}; 

var ul = intermediateUl 
    .ToList() 
    .Select(o => new PermissionInfo { 
     Permission = (o.pm2 == null ? -1 : pm2.Permission1), 
     PermissionId = (o.pm2 == null ? -1 : pm2.PermissionId) 
     UserName = o.UserName, 
     UserId = o.UserId, 
    }); 

的問題讓我吃驚的好,因爲兩行以上,我與外部的類似查詢加入的傳遞OK。似乎用linq外部結構檢查null是唯一可能的實體框架已知的實體。任何其他類別,無論是匿名還是混淆EF/linq。

我知道這個問題是舊的,但也許它會幫助別人:)

相關問題