2016-03-01 108 views
-1

好的,我發現很多網站提到這個問題,但沒有一個完全符合我需要做的。我有一個程序根據我從亞馬遜網絡服務收集的數據生成大量數據表。我正在嘗試編寫一個函數,它允許我在提供的數據表的任何列中搜索特定的字符串。LINQ查詢字符串

在我的程序的版本1,我手動建立我的查詢基於預定義的表結構:

newbie = RawEC2Results.AsEnumerable().Where(p => p.Field<string>("AccountID").Contains(FilterTagText.Text) || 
p.Field<string>("Profile").Contains(FilterTagText.Text) || 
p.Field<string>("Region").Contains(FilterTagText.Text) || 
p.Field<string>("Name").Contains(FilterTagText.Text) || 
p.Field<string>("InstanceID").Contains(FilterTagText.Text) || 
p.Field<string>("AvailabilityZone").Contains(FilterTagText.Text) || 
p.Field<string>("Platform").Contains(FilterTagText.Text) || 
p.Field<string>("Status").Contains(FilterTagText.Text) || 
p.Field<string>("Events").Contains(FilterTagText.Text) || 
p.Field<string>("EventList").Contains(FilterTagText.Text) || 
p.Field<string>("Tags").Contains(FilterTagText.Text) || 
p.Field<string>("Priv_IP").Contains(FilterTagText.Text) || 
p.Field<string>("Pub_IP").Contains(FilterTagText.Text) || 
p.Field<string>("Pub_DNS").Contains(FilterTagText.Text) || 
p.Field<string>("State").Contains(FilterTagText.Text) || 
p.Field<string>("vType").Contains(FilterTagText.Text) || 
p.Field<string>("iType").Contains(FilterTagText.Text) || 
p.Field<string>("SecurityGroups").Contains(FilterTagText.Text)); 

這是繁瑣的維護,因爲我必須更新我每次更改列添加新數據。我可以生成一個字符串來生成基於任何給定表的查詢,但無法弄清楚如何處理它。

  string nocasequery = "p=> "; 
     int colno = Table2Filter.Columns.Count; 

     for (int i =0; i < Table2Filter.Columns.Count ;i++) 
     { 
      if (i == colno) 
      { 
       CASEquery += @"p.Field<string>(""+Table2Filter.Columns[i]+ "").Contains(FilterTagText.Text) ; "; 
       nocasequery += @"p.Field<string>(""+Table2Filter.Columns[i]+ "").ToLower().Contains(FilterTagText.Text) ; "; 
      } 

那麼,有什麼想法?這不是一個數據庫,我發現的例子在datatable上不起作用。如果我只是將這個字符串傳遞給Where子句,我的工作就完成了。我無法弄清楚如何用其他方式構建這個查詢,而不是通過手工來完成,這就打擊了chunkskis。或者如果有一種方法可以告訴Linq在沒有明確地將它們發出的情況下搜索每一列?

回答

0

您可以輕鬆地自己動手創建這樣一個查詢。只需使用DataTable.Select方法,這是有一個類似SQL的語法:

void Main() 
{ 
    var dt = new DataTable(); 
    dt.Columns.Add("foo", typeof(string)); 
    dt.Columns.Add("bar", typeof(string)); 

    dt.Rows.Add("baz", "baaz"); 
    dt.Rows.Add("qux", "quux"); 

    var results = dt.Select("foo like '%a%'"); // finds baz 
} 

可以列出所有列,並建立從他們的查詢字符串,爲了這個例子是:

foo like '%{0}%' OR bar like '%{0}%' 
var columnNames = 
    dt.Columns.Cast<DataColumn>() 
    .Select(c => c.ColumnName); 

var query = string.Join(" OR ", columnNames.Select(x => x + " like '%{0}%'")); 

query = string.Format(query, "a"); 
var results = dt.Select(query); 

DataTable.Select Method (String)

DataView RowFilter Syntax [C#]

0

如果你真的想檢查數據行的任何字段值包含過濾文本,您可以遍歷行,每行通過自己的價值觀,並檢查是否在任何值行Contains()過濾文本:

var text = FilterTagText.Text; 
var matches = dt.AsEnumerable() // dt is a DataTable 
       .Where(r => dt.Columns.OfType<DataColumn>() 
           .Select(dc => (r[dc.Caption] ?? string.Empty).ToString()) 
           .Any(s => s.Contains(text)))