2017-03-08 57 views
0

目前我得到可能的組合數(因子的複選框的數量)並且寫了很多if語句,如下所示:基於選定的多個複選框篩選列表的最佳方式

假設我有3個的複選框:

if (IncludeIncomingCalls && !IncludeOutgoingCalls && !IncludeExternalCalls) 
      { 
       return _callsData.Where(x => x.IncomingCall && !x.OutgoingCall && !x.ExternalCall); 
      } 
      if (!IncludeIncomingCalls && IncludeOutgoingCalls && !IncludeExternalCalls) 
      { 
       return _callsData.Where(x => !x.IncomingCall && x.OutgoingCall && !x.ExternalCall); 
      } 
      if (!IncludeIncomingCalls && !IncludeOutgoingCalls && IncludeExternalCalls) 
      { 
       return _callsData.Where(x => !x.IncomingCall && !x.OutgoingCall && x.ExternalCall); 
      } 
      if (IncludeIncomingCalls && IncludeOutgoingCalls && !IncludeExternalCalls) 
      { 
       return _callsData.Where(x => x.IncomingCall && x.OutgoingCall && !x.ExternalCall); 
      } 
      if (IncludeIncomingCalls && !IncludeOutgoingCalls && IncludeExternalCalls) 
      { 
       return _callsData.Where(x => x.IncomingCall && !x.OutgoingCall && x.ExternalCall); 
      } 
      if (!IncludeIncomingCalls && IncludeOutgoingCalls && IncludeExternalCalls) 
      { 
       return _callsData.Where(x => !x.IncomingCall && x.OutgoingCall && x.ExternalCall); 
      } 

即使這將符合要求的,我不認爲這是考慮到的檢查箱子的數量可能在未來增加的最佳解決方案並且組合的數量可能會變得很大。

如果在基於選中的複選框過濾列表時出現了已知模式,那麼我還在遊蕩?

回答

1

將布爾值與每個字段進行比較。
試試這個:

return _callsData.Where(x => x.IncomingCall == IncludeIncomingCalls && x.OutgoingCall == IncludeOutgoingCalls && x.ExternalCall== IncludeExternalCalls); 
0

試試這個:

return _callsData.Where(x => x.IncomingCall==IncludeIncomingCalls && x.OutgoingCall==IncludeOutgoingCalls && x.ExternalCall==IncludeExternalCalls); 
0

請注意,您可以撰寫的IQueryable。您可以根據需要添加其他Where子句。

var result = callsData.Select(x => x); 

if (IncludeIncomingCalls) { 
    result = result.Where(x => x.IncomingCall); 
} 
else { 
    result = result.Where(x => !x.IncomingCall); 
} 

if (IncludeOutgoingCalls) { 
    result = result.Where(x => x.OutgoingCall); 
} 
else { 
    result = result.Where(x => !x.OutgoingCall); 
} 

if (IncludeExternalCalls) { 
    result = result.Where(x => x.ExternalCall); 
} 
else { 
    result = result.Where(x => !x.ExternalCall); 
} 

return result; 

我只是將其作爲一般模式顯示。對於您的用例,無處不在的開發人員的解決方案更易於閱讀和理解。

但是,如果條件比只是一個標誌更復雜,這種模式可能派上用場。只是作爲一個例子:

if (ShowOnlyActive) { 
    result = result.Where(x => x.State == CallState.Active); 
} 
else { 
    result = result.Where(x => x.State == CallState.Deleted || x.State == CallState.Inactive); 
} 

題外話,只是爲了進一步說明這個籠統的概念:添加附加條款,以一個IQueryable可以用來重構查詢的部分幫手或擴展方法,例如實現分頁。

public interface IPageableQuery { 
    // The page size (i.e. the number of elements to be displayed). 
    // The method processing the Query will Take() this number of elements. 
    int DisplayLength { get; set; } 

    // The number of elements that have already been displayed. 
    // The method processing the Query will Skip() over these elements. 
    int DisplayStart { get; set; } 
} 

public static IQueryable<T> ApplyPaging<T>(this IQueryable<T> entries, IPageableQuery query) 
    where T : class { 
    if (query.DisplayStart >= 0 && query.DisplayLength > 0) { 
     return entries.Skip(query.DisplayStart).Take(query.DisplayLength); 
    } 
    return entries; 
} 
0

您可以使用以下模式:

//some checkboxes 
CheckBox chkA = ... 
CheckBox chkB = ... 
CheckBox chkC = ... 

//build up your filters 
var filters = new List<Predicate<SomeEntity>>(); 
filters.Add(e => chkA.Checked && e.IsA); 
filters.Add(e => chkB.Checked && e.IsB); 
filters.Add(e => chkC.Checked && e.IsC); 

//And now simply apply the filters 
var entities = ... //some enumerable of SomeEntity 
var filteredEntities = entities.Where(e => filters.All(filter => filter(e))); 

請注意,這隻會正常工作,如果IsAIsBIsC是排除條件,但是這似乎是建立您目前擁有。