![](/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.