2012-12-28 220 views
0

我運行下面的查詢LINQ查詢拋出異常

var allroles = from l in metaData.Role select l.RoleId; 
var personroles = from k in metaData.PersonRole 
        where k.PersonId == new Guid(Session["user_id"].ToString()) 
        select k.RoleId; 
Dictionary<Guid, string> allroleswithnames = 
    (from l in metaData.Role 
    select new { l.RoleId, l.Description }) 
    .ToDictionary(u => u.RoleId, u => u.Description); 
var avl_roles = from j in allroles.Except(personroles) 
       select new 
       { 
        RoleId = j, 
        Description = allroleswithnames[new Guid(j.ToString())] 
       }; 
clist_avl_roles.DataSource = avl_roles; 
clist_avl_roles.DataBind(); 

代碼爲在代碼avl_roles拋出錯誤

Subquery returned more than 1 value. This is not permitted when the subquery 
follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

其實有多個行與同一人的ID角色ID。如何重寫查詢來處理這種情況?

回答

1
var personId = new Guid(Session["user_id"].ToString()); 
var personRoles = metaData.PersonRole 
          .Where(pr => pr.PersonId == personId) 
          .Select(pr => pr.RoleId);  

var avl_roles = from r in metaData.Role 
       where !personRoles.Contains(r.RoleId) 
       select new { r.RoleId, r.Description }; 

或在單次查詢

var avl_roles = from r in metaData.Role 
       join pr in metaData.PersonRole.Where(x => x.PersonId == personId) 
        on r.RoleId equals pr.RoleId into g 
       where !g.Any() 
       select new { r.RoleId, r.Description }; 
+1

它的工作的感謝 – Akshita

+0

@ akshita2gud請確認單的查詢選項也 –