2014-12-31 200 views
0

我想創建一個包含幾個子查詢的linq查詢。我創建了查詢似乎是正確的(至少在語法),但我送回到沒有數據和提琴手正顯示出與此查詢錯誤:C#LInq子查詢問題

 public IQueryable<vGatekeeperApproval> GetGatekeeperApprovals(string UserName) 
    { 
     SystemsFormsDataContext db = new SystemsFormsDataContext(); 
     IQueryable<vGatekeeperApproval> query; 

     Int32 UserId = GetCurrentUserId(UserName); 
     bool IsGatekeeperApprover = IsCurrentUserGKApprover(UserName); 
     string strSysApproverEmail = GetSystemsApproverEmail(UserName); 

     try 
     { 
      query = (from s in db.vGatekeeperApprovals 
        join r in db.Requests on s.RequestId equals r.Id 
        where (IsGatekeeperApprover == true || s.OverrideApproverId == UserId) 

        && (
        (
        from u in db.Staffs 
        where u.GateKeeperArea == 
         (from c in db.vGK_DIV_USING_CCs 
         where c.SEGMENT_CODE == 
          (from a in db.Attributes 
          where a.AttributeItemId== global_COSTCENTRE && a.FormId==s.Id 
          select a.AttributeValue).FirstOrDefault() 
         select c.PARENT_CODE_L3 
         ).FirstOrDefault() 
        select u.Id 

        ).ToList().Contains(UserId) 

        ) 

        select s 
        ); 


     } 
     catch (Exception ex) 
     { 
      query = (from s in db.vGatekeeperApprovals 
        where s.UserId == 0 
        select s); 

      //LogEvent("ERROR!" + ex.Message, ex.Source); 
     } 

     return query; 
    } 

任何想法是什麼原因造成的問題?有沒有更好的方法來在linq中創建子查詢?

任何幫助將不勝感激。

舒亞

+0

你會得到什麼錯誤? – SLaks

回答

0

你不能在數據庫服務器上執行的LINQ-SQL查詢中使用.FirstOrDefault()和.ToList()。這些操作強制對象在內存中。

試着改變使用.FirstOrDefault()和.ToList()的,而不是使用外連接,如:

join a in db.Attributes on 
     new {AID=global_COSTCENTRE,s.Id} equals 
     new {AID=a.AttributeItemId,a.FormId} into aouter 
from x in aouter.DefaultIfEmpty().Take(1) 

然後你就可以測試對於x == null或不是。

按照這種模式,你可以重構甚至不使用子查詢,只是外連接到第一行沒有。

如果你的所有對象都在內存中,這將是有效的Linq,只是無效的Linq-sql。

+0

謝謝Kimbonics –