查询1
var resulty = db.QIS
.Where(w=>w.QSA.Any(a => a.QSID != w.QSID))
.Select(s => s.QSID).ToList();
查询2
var resultz = db.QIS
.Where(w=>w.QSA.Where(h => h.QSID == w.QSID).Select(s => s.QSID).FirstOrDefault() != w.QSID)
.Select(s => s.QSID).ToList();
表QIS
和QSA
相关Many:Many
。这里的想法是找出QIS.ID's
QSA
中找不到多少QIS.QID == QSA.QID
。
Query 1
返回0
Query 2
给了我预期的结果(所有不匹配的QIS记录列表。)
为什么任何不起作用? - 我发现自己在单独的场景中遇到过几次相同的情况......感谢任何帮助/想法。
PS:首选方法语法。
答案 0 :(得分:4)
在第二个版本的过滤中,只有在内部Where
子句未返回任何元素时才会为true,以便FirstOrDefault()
返回null
或0
(取决于如果类型可以为空或可以为空。)
w=>w.QSA.Where(h => h.QSID == w.QSID)
.Select(s => s.QSID).FirstOrDefault() != w.QSID
相当于(现在假设QSID
是一个不可为空的数字类型,如果它可以为空,则使用null
而不是零):
w=>w.QSA.Where(h => h.QSID == w.QSID)
.Select(s => s.QSID).FirstOrDefault() == 0
可以改写为:
w=>w.QSA.Where(h => h.QSID == w.QSID).FirstOrDefault() == null
可以改写为:
w=>!w.QSA.Any(h => h.QSID == w.QSID)
与您的初始版本几乎相同,但并不完全相同。你仍然想检查里面 Any()
过滤器的等价,但是否定结果。