![](/img/trans.png)
[英]Creating dynamic linq expression OData for multiple conditions for filter Contains?
[英]Avoid to browse a list multiple time with linq, with dynamic conditions (filter)
我有一个包含Article
对象的列表。 该对象的参数是
类别,描述,状态,类
用户可以使用他想要的组合过滤列表。 仅描述,或类别+类,依此类推。
因此,如果用户选择一个标准,我将得到一个int> = 0,否则我将得到-1。
例如,如果他选择过滤Status
和Category
,我会得到
FilterCategory = x,FilterDescription = -1,FilterStatus = y,FilterClass = -1
我过滤列表的方法如下:
if (FilterCategory != -1)
list = list.Where(a => a.Category == FilterCategory);
if (FilterDescription != -1)
list = list.Where(a => a.Description == FilterDescription);
if (FilterStatus != -1)
list = list.Where(a => a.Status == FilterStatus);
if (FilterClass != -1)
list = list.Where(a => a.Class == FilterClass);
通过这种方式,我必须迭代列表4次,它对很多项目效率不高。 我会浏览一次列表,并在一个独特的位置检查4条件。 但我不知道具体情况如何做到这一点!= -1。
谢谢
作为Juharr在评论中提到,LINQ的不会评价你的.Where
调用它之后。 只有在调用ToList/ToArray/First/Single/foreach
时,它才会评估该子句,它会自动组合您的过滤器。
你可以做一个巨大的地方查询将所有条件移动到一个Where
通过注意:
if (FilterCategory != -1)
list = list.Where(a => a.Category == FilterCategory);
相当于:
list = list.Where(a => FilterCategory == -1 || a.Category == FilterCategory);
然后查询是:
list = list.Where(a => (FilterCategory == -1 || a.Category == FilterCategory)
&& (FilterDescription == -1 || a.Description == FilterDescription)
&& (FilterStatus == -1 || a.Status == FilterStatus)
&& (FilterClass == -1 || a.Class == FilterClass));
但我真的怀疑它会提高你的枚举性能。
list = list.Where(a => (FilterCategory != -1 || a.Category == FilterCategory) &&
(FilterDescription != -1 || a.Description == FilterDescription) &&
(FilterStatus != -1 || a.Status == FilterStatus) &&
(FilterClass != -1 || a.Class == FilterClass));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.