2012-03-06 6 views
3

ループを使用して配列を循環させ、各繰り返しでクエリwhere句の配列値を使用してLINQクエリを実行しようとしています。LINQクエリをループしてDataTableに結果を追加する

これらの結果を連続して追加し、その結果をDataTableとして返します。

どうすれば結果を追加できますか? DataTable .Merge()メソッドを試しましたが、暗黙的に型voidをDataTableに変換できません。エラーを受け取り、ジェネリック型スコープの問題のためにクエリ結果を追加する方法を理解できません。

EDIT:コード...(または私がこれまで試してみましたバージョンの少なくとも一つ)

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

+0

データテーブルの代わりにリストを使用できますか? – Gage

答えて

4

results = results.Merge(toMerge);を行うべきではありません。 Merg関数は呼び出し元のDataTableに対して機能し、何も返しません。

+0

私の愚かな間違い! – CatchingMonkey

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); 
} 

あなたは本当に多くの項目がある場合、それはループ実行の実際のパフォーマンスを測定する興味深いものになるだろう、とくださいシェア結果、あなたができれば:あなたはちょうどresults.Merge(toMerge);を行う必要がある

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

何千もの行が返されている可能性があります。結果をループせず、それぞれを追加します。 – CatchingMonkey

+1

カスタム 'ForEach()'拡張メソッドを使用すると、同じループで結果を消費することができます – sll

+1

私はこのようにすることができなかったことを認識しませんでした。私は調査し、時間があるときにあなたに戻ろうとします。ヒントをありがとう! – CatchingMonkey

関連する問題