2012-11-26 77 views
1

我正在使用通用函數來過濾記錄列表。使用動態查詢庫的C#篩選器列表?

功能如下:

class FilterRecords 
{ 

    public static object ParseExpression(string Condition, string FilterColumn) 
    { 
     string _operator = ""; 
     string _condition = "";      

     if (Condition.Substring(0, 1) == "<" || Condition.Substring(0, 1) == ">") 
     { 
      _operator = Condition.Substring(0, 1); 

      if (Condition.Substring(1, 1) == "=") 
      { 
       _operator += "="; 
       _condition = Condition.Substring(2); 
      } 
      else 
      { 
       _condition = Condition.Substring(1); 
      } 
      _operator = "="; 
      return (dbContext.OrdsRlsds.AsQueryable().Where(FilterColumn + " " + _operator + " " + " @0", _condition).ToList()); 
     } 
     else 
     { 
      if (Condition.Contains(',')) 
      { 
       string[] conds = Condition.Split(','); 
       return (dbContext.OrdsRlsds.AsQueryable().Where(FilterColumn + " >= @0 && " + FilterColumn + " <= @1", conds).ToList()); 

      } 
      else 
      { 
       return (dbContext.OrdsRlsds.AsQueryable().Where(FilterColumn + " == @0", Condition).ToList()); 
      } 
     } 
    } 
} 

此功能使用動態查詢庫。目前,它只過濾一種類型的記錄 - OrdsRlsds。我需要將其作爲通用過濾器,以便我可以傳遞任何集合,然後獲取過濾結果。

+0

試試這個話題http://stackoverflow.com/questions/7557761/apply-多重過濾到wpf-datagrid-using-c-sharp可能你可以得到一些想法。 – Godfre

+0

這個問題是由我問:) – sony

回答

1

您使用的是Entity Framework嗎?如果是這樣,那麼你可以用泛型做這樣的事情嗎?

public static IList<T> ParseExpression<T>(string Condition, string FilterColumn) where T:class 
{ 
    var query = dbContext 
       .CreateObjectSet<T>() 
       .AsQueryable(); 

    //add filters etc. 

    return query.ToList(); 
} 

你將不得不通過所需的實體類型爲類型參數的方法是這樣的:

FilterRecords.ParseExpression<OrdsRlsd>(condition, filterColumn); 
+0

嗨,湯姆,很好的答案。我沒有得到它的最後部分「然後你必須將所需的實體類型作爲類型參數傳遞給你的方法。」我感謝您的幫助。謝謝 – sony

+0

另外湯姆,我有一個可觀察的集合,我必須執行過濾器。我們是否可以將這個可觀察集合傳遞給此函數,並通過已過濾的記錄取回新的可觀察集合 – sony

+0

我已經更新了我的答案。我不確定您的第二條評論是如何應用的,因爲我認爲數據來自EF /數據庫? –