2011-06-16 59 views
1

如何創建一個自定義的通用LINQ過濾器會檢查是否泛型類包含一個屬性名稱,並返回查詢...通用自定義LINQ過濾

我有類似:

public static IQueryable<T> GetAllByType<T>(
     this IQueryable<T> customQuery, string seller) where T : class, new() 
    { 
     customQuery = customQuery.Where(i => i.GetType().Name == "TypeOfSeller"); 
     return customQuery; 
    } 

如果餐桌上的物業類型T存在,那麼我想用串賣家傳過來的參數...

簡單過濾表達式:返回將由賣方對篩選該表的表達式這可能是「大」,「小」等

+0

你如何在屬性的名稱傳遞?或者是「TypeOfSeller」屬性的名稱? – 2011-06-16 12:19:06

+0

我不確定你的問題到底是什麼。 – Sven 2011-06-16 12:20:09

+0

TypeOfSeller是固定的屬性,如果該屬性存在於任何表上,則基於該屬性過濾表 - 將參數傳遞給此方法,這是否有意義? – Haroon 2011-06-16 12:20:51

回答

2

我會重構一下,以便沒有「如果」涉及,但我只發送符合該方法的實體。

您要考慮的下一件事是,如果有多個實體模型共享一個屬性名稱,並且想要共享關於該屬性名稱的邏輯,請利用代碼生成的類的partial方面來擴展這些類並讓他們每個人都實現一個接口。

interface ISeller 
{ 
    string TypeOfSeller { get; set; } 
} 

這將允許您將接口添加到該方法的限制的清單,並讓你簡單地直接利用TypeOfSeller財產,但不嘗試採取其他方法(如反射)。

3

我認爲這是你所描述的。

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 

    namespace ConsoleApplication3 
    { 
     class Seller 
     { 
      public string Name { get; set; } 
      public string TypeOfSeller { get; set; } 
     } 

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

     static class Program 
     { 


      static void Main(string[] args) 
      { 
       List<Seller> sellers = new List<Seller>(); 
       sellers.Add(new Seller() { Name = "A", TypeOfSeller = "Test" }); 
       sellers.Add(new Seller() { Name = "B", TypeOfSeller = "Test" }); 
       sellers.Add(new Seller() { Name = "C", TypeOfSeller = "Other" }); 

       var q = from p in sellers.AsQueryable<Seller>().GetAllByType("Test") select p; 

       List<SomeOtherData> other = new List<SomeOtherData>(); 
       other.Add(new SomeOtherData() { Name = "A" }); 
       other.Add(new SomeOtherData() { Name = "B" }); 
       other.Add(new SomeOtherData() { Name = "C" }); 

       var q2 = from p in other.AsQueryable<SomeOtherData>().GetAllByType("Test") select p; 

       foreach (var x in q) 
        Console.WriteLine(x.Name + ", " + x.TypeOfSeller); 

       Console.WriteLine("Other Data: "); 

       foreach (var x in q2) 
        Console.WriteLine(x.Name); 


       Console.ReadLine(); 
      } 

      public static IQueryable<T> GetAllByType<T>(this IQueryable<T> customQuery, string seller) where T : class, new() 
      { 
       var prop = typeof(T).GetProperty("TypeOfSeller"); 
       if(prop != null) 
        customQuery = customQuery.Where(i => prop.GetValue(i, new object[] {}).ToString() == seller); 
       return customQuery; 
      } 
     } 
    } 

的輸出是:

  • A,試驗
  • B,試驗
  • 其他數據:
  • Ç
0

的問題不是很清楚,但聽起來像是你想這樣的事情

public static IQueryable<T> GetAllByType<T>(
    this IQueryable<T> customQuery, string seller) where T : class, new() 
{ 
    return from i in customQuery 
       let prop = typeof(T).GetProperty("SellerType") 
       where prop != null && prop.GetValue(i, null).Equals(seller) 
       select i; 
}