2014-12-31 150 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 –