我通常使用lambda表示法进行选择,但对连接感到失望。我用LINQPad给自己做了一个简单的练习。LINQ查询为:
List<int> allStudents = new List<int> {1,2,3,4,5,6,7,8,9};
List <int> studentsIdList = new List<int> {1,3,5,7,9};
var q =
from c in allStudents
join p in studentsIdList on c equals p into ps
from p in ps.DefaultIfEmpty()
where p == 0
select new { Student = c};
q.Dump();
产生预期的结果集
2,4,6,8
.
然而,当我用lambda表示法将其写成:
List<int> allStudents = new List<int> {1,2,3,4,5,6,7,8,9};
List <int> studentsIdList = new List<int> {1,3,5,7,9};
var q =
allStudents
.GroupJoin(
studentsIdList,
m => allStudents,
n => studentsIdList,
(m, n) => new {allS = m, excS = n.DefaultIfEmpty(0)})
.Where(x => x.excS.SingleOrDefault () == 0)
.Select (x => x.allS);
q.Dump();
我得到一组结果
1,2,3,4,5,6,7,8,9
AND LINQPad不显示lambda转换。
两个问题:
-
lambda查询有什么问题?
-
如何让LINQPad显示lambda转换?
更新
使用下面的答案,我能够纠正我的尝试
List<int> allStudents = new List<int> {1,2,3,4,5,6,7,8,9};
List <int> studentsIdList = new List<int> {1,3,5,7,9};
var q = allStudents
.GroupJoin(studentsIdList,
a => a, b => b,
(a, b) => new { Id = a, Present = b.DefaultIfEmpty() })
.Where(x => x.Present.Single() == 0)
.Select(x => x.Id);
q.Dump();
非常感谢。