2017-07-26 67 views
-1

假設我有對象,如下面:IEnumerable的<T>過濾

系統:

public class SystemDto 
{ 
    public int Id { get; set; } 
    public string Ip { get; set; } 
    public string Url { get; set; } 
    public RegionDto Region { get; set; } 
    public ApplicationDto Application { get; set; } 
    public bool Status { get; set; } 
} 

應用:

public class ApplicationDto 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

地區:

public class RegionDto 
{ 
    public string Name { get; set; } 
} 

現在讓我們假設我有IEnumerable<SystemDto> 我想查詢在不同的條件下,這個對象:

  1. 通過RegionDto.Name
  2. 通過IEnumerable<RegionDto.Name>
  3. 通過IEnumerable<RegionDto.Name>IEnumerable<ApplicationDto.Name>
  4. 通過RegionDto.NameIEnumerable<ApplicationDto.Name>
  5. 通過RegionDto.NameApplicationDto.Name

我可以寫其他條件,但我認爲你明白了我的觀點。當SystemDto中的字段數量增加時,條件會增加。 我的問題是過濾方法應該是什麼樣子?我不認爲有一個方法具有所有參數是好主意,因爲它可能會發生,我將不得不把null不需要的字段,然後在身體檢查是否提供。當我有一個具有20個或更多字段的對象時,它也會有很多行。

- 編輯

@Henric我認爲你的答案是什麼,我需要,但我有一個問題。我有IRepository和IService接口。我不想從數據源中提取所有記錄,並在即將使用之前對其進行過濾。如果我想在存儲庫類中對其進行過濾,但是在服務類中,我將擁有TSource = SystemDto。我將不得不以某種方式映射TSources。這可能嗎?

+1

這有幫助嗎? https://msdn.microsoft.com/library/bb534803(v=vs.110).aspx – Henrik

+2

你需要一個過濾器方法嗎?你不能簡單地調用列表中的「Where」並指定當時要過濾的屬性嗎?另一種方法是編寫一個包含所有可選參數的方法,每個參數的默認值爲'null'。然後你可以在你每次打電話時提供你想要的。 – jmcilhinney

回答

1

所以,也許這會有所幫助:

///Your Extensions class 
public static class MyExtensions 
{ 
    public static IEnumerable<T> Filter<T> (this IEnumerable<T> src, params Func<T, bool>[] predicates) 
    { 
     IEnumerator<T> enumerator = src.GetEnumerator(); 

     while (enumerator.MoveNext()) 
      if (predicates.All(condition => condition(enumerator.Current))) 
       yield return enumerator.Current; 
    } 

用法:

myList = myList.Filter(x => x.Region.Name == "someRegionName", 
         x => x.Application.Name == "someAppName" 
         /*And the list goes on(for the ones you want, duhh)*/ 
); 

或者只是使用什麼樣的LINQ已經有了:

myList = myList.Where(x => x.Region.Name == "someRegionName" && 
          x.Application.Name == "someAppName" 
          /*And the list goes on(for the ones you want, duhh again)*/ 
); 

或者,如果您有默認的過濾器,可以使用默認過濾器創建擴展方法類,以避免重寫大量重複過濾器。

public static IEnumerable<MyClass> WhereDefaulted(this IEnumerable<MyClass> src, Func<MyClass,bool> predicate) 
{ 
    return src.Where(x => predicate(x) && 
          x.Some.Property == "someValue" && 
          x.Other.Property == 12); 
} 

,然後使用它:

myList = myList.WhereDefaulted(x => x.Some.Other.Property == 'l'); 

對不起,我英文不好。

相關問題