2012-03-06 79 views
3

我試圖使用循環遍歷數組,並在每次迭代中使用查詢where子句中的數組值執行LINQ查詢。循環LINQ查詢並將結果附加到DataTable

我則想要做的就是這些結果附加先後在一起,然後返回結果的DataTable。

如何將結果附加在一起?我嘗試了DataTable .Merge()方法,但收到一個錯誤(「無法隱式地將void類型轉換爲DataTable」),並且由於泛型類型範圍問題而無法解決查詢結果的附加問題。

編輯:代碼...(或版本中的至少一個到目前爲止我試過)

DataTable results = new DataTable(); 

    foreach (string toFind in searchString) 
    { 

     DataTable toMerge = new DataTable(); 

     var searchResults = from a in dt.AsEnumerable() 
          where a.Field<string>("A").ToUpper().Contains(toFind.ToUpper()) 
          select new 
          { 
           A= a.Field<Int32>("A"), 
           B= a.Field<string>("B"), 
           C= a.Field<string>("C"), 
          }; 

     toMerge = ConvertDataTable.FromLINQ(searchResults.AsQueryable()); // Method I have to convert the LINQ query to a DataTable 

     results = results.Merge(toMerge); 

    } 

任何想法?

在此先感謝

克里斯

+0

向我們展示一些代碼 – Stacker 2012-03-06 12:42:48

+0

您可以使用列表而不是數據表嗎? – Gage 2012-03-06 13:39:29

回答

4

你只需做results.Merge(toMerge);你不應該這樣做results = results.Merge(toMerge);。因爲Merg函數作用於調用者DataTable,並且不返回任何內容。

+0

我的愚蠢的錯誤! – CatchingMonkey 2012-03-06 14:19:10

1

我相信使用Merge()ConvertDataTable.FromLINQ()每個循環週期是相當昂貴的。爲什麼在查詢搜索結果的同時不做results.Rows.Add()

foreach (string toFind in searchString)  
{ 
    var searchResults = dt.AsEnumerable() 
         .Where(a => a.Field<string>("A") 
             .ToUpper() 
             .Contains(toFind.ToUpper()) 
         .Select(a => new object[] { 
              a.Field<Int32("A"), 
              a.Field<string>("B"), 
              a.Field<string>("C") 
         }) 
         .ForEach(re => results.Rows.Add(re)); 
} 


// ForEach() extension method would help you adding rows to a data table 
// in the same time as querying the results 
public static void ForEach<T>(
    this IEnumerable<T> source, 
    Action<T> action) 
{ 
    foreach (T element in source) 
     action(element); 
} 

如果你真的有很多的項目,這將是有趣的測量循環執行的實際性能,並份額的結果,如果你可以:

var stopwatch = System.Diagnostics.Stopwatch.StartNew(); 
foreach() { ... } 
stopwatch.Stop; 
double totalMilliseconds = stopwatch.TotalMilliseconds; 
+0

可能有成千上萬的行返回,我寧願不循環遍歷結果以及追加每行。 – CatchingMonkey 2012-03-06 12:58:30

+1

使用自定義的'ForEach()'擴展方法,你可以在同一個循環中使用結果 – sll 2012-03-06 13:07:20

+1

我沒有意識到你可以這樣做,我會調查並嘗試在我有一些時間時回覆你。謝謝你的提示! – CatchingMonkey 2012-03-06 14:19:45