2017-11-30 12 views
0

内の行を比較してください。私は次のコードを使用してTodaysTableに存在していない私はYesterdaysTableに何があるかを知らせるために違いを見つけるためにしようとすると、私はエラーを取得する:は、私はこのようになります2つのDataTableを持っているのDataTable

InvalidOperationException: the source contains no DataRows

が、そこは私の元で行です:

DataTable dtSource = new DataTable(); 
dtSource = yesterdaysTable.AsEnumerable().Except(todaysTable.AsEnumerable()).CopyToDataTable(); 

var difference = yesterdaysTable.AsEnumerable().Select(r => r.Field<string>("Apps")).Except(todaysTable.AsEnumerable().Select(r => r.Field<string>("Apps"))); 

if (difference.Any()) 
{ 
    DataTable Table3 = (from row in todaysTable.AsEnumerable() 
         join app in difference on row.Field<string>("Apps") equals app 
         select row).CopyToDataTable(); 
} 

私は似たコードを使用する場合、私は同じエラーを取得:

var appsNotInB = yesterdaysTable.AsEnumerable().Select(r => r.Field<string>("Apps")) 
     .Except(todaysTable.AsEnumerable().Select(r => r.Field<string>("Apps"))); 

var TableC = (from row in yesterdaysTable.AsEnumerable() 
       join id in appsNotInB on row.Field<string>("Apps") equals id 
       select row).CopyToDataTable(); 

を私は限りWRIにしようとして行ってきましたTE無駄に、List<string>オブジェクトに差異を入れしようとするために、ループの入れ子になった:

for (int i = 0; i < yesterdaysTable.Rows.Count; i++) 
{ 
    for (int j = 0; j < todaysTable.Rows.Count; j++) 
    { 
     if (yesterdaysTable.Rows[i]["Apps"].ToString() != todaysTable.Rows[j]["Apps"].ToString()) 
     { 
      //lstNoMatch.Add(yesterdaysTable.Rows[i]["Apps"].ToString()); 
      lstNoMatch.Add(todaysTable.Rows[j]["Apps"].ToString()); 
     } 
    } 
} 

私はいくつかの異なる解決策を試してみたが、何も作業していないと私はポストはなりたくありません不必要に長い私はデッドエンドをヒットしました:(

任意の提案は?クエリがローを返さdidntの場合

+0

エラーが発生するのはどのラインですか? – ViRuSTriNiTy

+0

@ViRuSTriNiTy:このLINQ文:= データテーブル表3( )(todaysTable.AsEnumerableの行からはrow.Field に差 におけるAPPを結合( "アプリ")は、アプリ 選択行に等しい).CopyToDataTable(); – GrammatonCleric

+0

'CopyToDataTable'は、クエリが行を返さなかった場合にこの例外をスローします。なぜ私はその方法を避ける一つの理由。 'query.Any()'で事前チェ​​ックするのを避けることができます。しかし、それは2回実行されます。行を追加するための古典的な 'foreach'が望ましいでしょう。 –

答えて

1

CopyToDataTableは、この例外がスローされます。私はその方法を避ける理由の一つは、あなたが事前にチェックして例外を避けることができquery.Any()としかし、それはそれを2回実行ので、行を追加するforeachが優先される

I try to find the differences to let me know what's in YesterdaysTable that does not exist in TodaysTable

次に、このクエリは仕事(あなたはこれを正しくやった)を行います。。。

var onlyYesterdayApps = yesterdaysTable.AsEnumerable() 
    .Select(r => r.Field<string>("Apps")) 
    .Except(todaysTable.AsEnumerable().Select(r => r.Field<string>("Apps"))); 

あなたがソースとしてYesterdaysTableを使用する必要が3番目のテーブル内の行をしたい場合:

DataTable result = yesterdaysTable.Clone(); // empty table with same columns 
var yesterdayRows = from r in yesterdaysTable.AsEnumerable() 
        join app in onlyYesterdayApps 
        on r.Field<string>("Apps") equals app 
        select r; 
foreach(DataRow row in yesterdayRows) 
    result.ImportRow(row); // import rows if the query above yielded rows 

ただ、最終foreachは(実際には1つにマージされている)の2つのクエリを実行します。

+0

これは正しい方向へのステップです。それは私が本当に進む必要があるすべてです。どうもありがとう! :) – GrammatonCleric

関連する問題