1

私はLINQが初めてです。2 番目のデータ テーブルに存在しない行を見つけようとしています。

report_list とベンチマークの両方のタイプは、DataTable です。これらのデータ テーブルは両方とも、OleDbCommand、OleDbDataAdapter を使用して設定されています。「指定されたキャストは無効です」というエラーが表示されます。foreach ... ループで。よろしくお願いします。

            var result = from a in report_list.AsEnumerable()
                         where !(from b in benchmark.AsEnumerable()
                                 select b.Field<int>("bench_id")
                                )
                                .Contains(a.Field<int>("BenchmarkID"))
                         select a;



            foreach (var c  in result)
            {
                Console.WriteLine(c.Field<string>("Name"));
            }
4

4 に答える 4

1

あなたの質問を理解したかどうかはわかりません。最初のテーブルには存在するが、2番目のテーブルには存在しないアイテムを取得しようとしていますか?


var first = new string[] { "b", "c" };
var second = new string[] { "a", "c" };
//find the itens that exist in "first" but not in "second"
var q = from f in first
        where !second.Contains(f)
        select f;
foreach (var s in q) {
    Console.WriteLine(s);
}

//Prints:
//b

外部レコードに依存しなくなったら、最初に内部クエリを作成することをお勧めします。

于 2008-11-26T20:17:55.943 に答える
0
From a in report_list
Group Join b in benchmark On a.bench_id Equals b.bench_id Into g = Group
Where g.Count = 0
Select a

これは VB 構文であることに注意してください。

于 2008-11-27T00:25:51.967 に答える
0

おそらく、.Except() 拡張機能を使用して、2 つのセットのセットの違いを取得しますか?

(from b in benchmark.AsEnumerable()  
    select new { id = b.Field<int>("bench_id")}).Except(
         from a in report_list.AsEnumerable() 
             select new {id = a.Field<int>("BenchmarkID")})

実際には正確な構文はわかりませんが、ベンチマークで ID を取得し、report_list で同等の ID をすべて削除して、一致しない ID のみを残すことで機能するはずです。(これがあなたが望んでいた順序であることを願っています...)

注: これは、tvanfosson が言及した上記の問題も問題ではないことを前提としています。

于 2008-11-27T14:38:27.737 に答える
0

私の疑いでは、比較しているフィールドの 1 つがデータベース内の整数ではないということです。無効なキャスト例外はField<int>()、このメソッドがスローできる 3 つの異なる例外の 1 つであるため、呼び出しの 1 つによってスローされていると思います。こちらのドキュメントを参照してください。

于 2008-11-27T03:55:46.143 に答える