Sql 转换嵌套的";在";对林克兰姆达的声明

Sql 转换嵌套的";在";对林克兰姆达的声明,sql,linq,select,lambda,nested,Sql,Linq,Select,Lambda,Nested,im使用vs2010,并具有如下所示的sql语句 select deptId, deptName, Detail from lkDept where deptId in (select deptId from lkDeptLinks where userRef in (select ref from lkUsers where userId = @userId)) order by deptName 我需要将上面的语句转换为linq语句,lambda会很好 所有表都在dbml中 到目前为止,这

im使用vs2010,并具有如下所示的sql语句

select deptId, deptName, Detail from lkDept where deptId in (select deptId from lkDeptLinks where userRef in (select ref from lkUsers where userId = @userId)) order by deptName
我需要将上面的语句转换为linq语句,lambda会很好

所有表都在dbml中

到目前为止,这就是我所面临的困境,很明显,这是行不通的

var queryUsers = dc.lkUsers.Where(p => p.UserID == userId);
var queryLinks = dc.lkDeptLinks.Where(p => queryUsers.ref.contains(p.ref));
var queryDept = dc.lkDepts.Where(p => queryLinks.deptid.contains(p.deptid));
任何帮助都将被预先告知并感谢


好的,谢谢你们的帮助,我最终得到了这样的结果

  using (var dc = new myDataContext(DB.GetConnectionString()))
  {
      var queryUsers = dc.lkUsers.Where(p => p.UserID == userId).Select(p => p.@ref); 
      var queryLinks = dc.lkDeptLinks.Where(p => queryUsers.Any(x => p.UserRef  == x )).Select(p => p.DeptId);
      var queryDept = dc.lkDepts.Where(p => queryLinks.Any(x => p.DeptID == x)).OrderBy(p => p.deptName).Select(p => new SLDepartment(p));

      if (queryDept.Any())
        return new SLDepartments(queryDept);

  }
请注意,施工人员、SLDept部门(lkDept dept)和SLDeparts部门(IEnumerable collection)使用LINQ是否合适


任何gotachas i可能缺失,即上述或整个解决方案可能出现异常或性能问题?

您的尝试似乎是正确的,但仅应更改包含->任何,并且是不完整的:

var queryUsers = dc.lkUsers.Where(p => p.UserID == userId);
var queryLinks = dc.lkDeptLinks.Where(p => queryUsers.ref.Any(x=>x== p));
var queryDept = dc.lkDepts.Where(p => queryLinks.deptid.Any(x=> x == p.deptid));
return  queryDept
        .Select(x=>new {ID = x.deptId, Name = x.deptName, Detail = x.Detail})
        .ToList();

我觉得你很接近。如果将前两个查询更改为仅返回您关心的值,例如
。选择(p=>p.ref)
。选择(p=>p.deptId)
,您应该可以开始了。请注意.Contains()存在参数计数不能超过2100而不引发异常的问题。太好了,谢谢您的帮助,请注意!谢谢赛义德,非常感谢@MichaelRandall,不客气,希望这有帮助,但如果对您有用,您可以将此标记为已接受的答案,请参阅。