[英]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.