为什么2个LINQ查询的评估方式不同

时间:2014-02-11 21:30:40

标签: c# linq

查询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();

QISQSA相关Many:Many。这里的想法是找出QIS.ID's QSA中找不到多少QIS.QID == QSA.QID

Query 1返回0

另一方面,

Query 2给了我预期的结果(所有不匹配的QIS记录列表。)

为什么任何不起作用? - 我发现自己在单独的场景中遇到过几次相同的情况......感谢任何帮助/想法。

PS:首选方法语法。

1 个答案:

答案 0 :(得分:4)

在第二个版本的过滤中,只有在内部Where子句未返回任何元素时才会为true,以便FirstOrDefault()返回null0(取决于如果类型可以为空或可以为空。)

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()过滤器的等价,但是否定结果。