繁体   English   中英

我的lambda表达式没有产生我预期的结果

[英]My lambda expression isn't producing the result I expected

courses = courses.Where(
                c => queryParameters.ShowInActive || c.Flags.Contains((ulong)CourseFlags.Active) 
                     &&
                     (queryParameters.AuthorId <= 0 ||
                      (c.Authors != null && c.Authors.Exists(a => a.ID == queryParameters.AuthorId)))
                     &&
                     (queryParameters.CategoryIDs == null || queryParameters.CategoryIDs.Count == 0 ||
                      (c.Tags != null && c.Tags.Any(t => queryParameters.CategoryIDs.Contains(t.ID)))
                      &&
                      queryParameters.CourseIDs == null || queryParameters.CourseIDs.Count == 0 ||
                      queryParameters.CourseIDs.Contains(c.ID))
                ).ToList();

问题是queryParameters.CourseIDS.Count()返回157,但上面的lambda表达式返回2500条记录。 我究竟做错了什么?

我还确保将ShowInactive设置为true并且CategoryIDs为null且AuthorId为0

tl;博士:你忘记了一些括号。

如上所述,当queryParamters.ShowInActive设置为true ,谓词返回true并返回所有记录。 因此,返回所有记录。 您似乎想要使用所有查询参数。 为清晰起见,请尝试在此复杂查询中添加一些空格。 或者考虑将其拆分为多个Where()调用。

courses = courses.Where(
              c => (
                    queryParameters.ShowInActive
                    ||
                    c.Flags.Contains((ulong)CourseFlags.Active)
              ) && (
                    queryParameters.AuthorId <= 0
                    || (
                        c.Authors != null
                        &&
                        c.Authors.Exists(a => a.ID == queryParameters.AuthorId)
                       )
              ) && (
                    queryParameters.CategoryIDs == null
                    ||
                    queryParameters.CategoryIDs.Count == 0
                    || (
                        c.Tags != null
                        &&
                        c.Tags.Any(t => queryParameters.CategoryIDs.Contains(t.ID))
                       )
              ) && (
                    queryParameters.CourseIDs == null
                    ||
                    queryParameters.CourseIDs.Count == 0
                    ||
                    queryParameters.CourseIDs.Contains(c.ID)
                   )
              )
            ).ToList();

问题在于运算符优先级,特别是&&的优先级高于||。 因此,如果不花太多钱,请尝试以下方法:

courses = courses.Where(
            c => (queryParameters.ShowInActive || c.Flags.Contains((ulong)CourseFlags.Active))
                 &&
                 (queryParameters.AuthorId <= 0 ||
                  (c.Authors != null && c.Authors.Exists(a => a.ID == queryParameters.AuthorId)))
                 &&
                 ((queryParameters.CategoryIDs == null || queryParameters.CategoryIDs.Count == 0 ||
                  (c.Tags != null && c.Tags.Any(t => queryParameters.CategoryIDs.Contains(t.ID))))
                  &&
                  (queryParameters.CourseIDs == null || queryParameters.CourseIDs.Count == 0 ||
                  queryParameters.CourseIDs.Contains(c.ID)))
            ).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM