C LInq子查询问题

C LInq子查询问题,linq,linq-to-sql,subquery,Linq,Linq To Sql,Subquery,我正在尝试创建一个包含几个子查询的linq查询。我创建的查询似乎至少在语法上是正确的,但我没有收到返回的数据,Fiddler显示此查询有错误: public IQueryable<vGatekeeperApproval> GetGatekeeperApprovals(string UserName) { SystemsFormsDataContext db = new SystemsFormsDataContext(); IQu

我正在尝试创建一个包含几个子查询的linq查询。我创建的查询似乎至少在语法上是正确的,但我没有收到返回的数据,Fiddler显示此查询有错误:

        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中创建子查询

任何帮助都将不胜感激


Shuja

不能使用.FrestRealStudio和.TLIST在LIQ-SQL查询的中间,在DB服务器上执行。这些操作将强制对象在内存中存储

尝试将.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。

您会遇到什么错误?