我的 lambda 表达式没有产生我预期的结果
本文关键字:结果 lambda 表达式 我的 | 更新日期: 2023-09-27 18:29:38
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
dr:你忘了一些括号。
如前所述,当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();