3

2つのデータテーブルがあります。1つはルックアップリストで、もう1つはデータです。テーブルにはデータを保持する多くの列列があり、これらの列の1つはルックアップデータテーブルへの外部キー列です。

外部キー列のIDに基づいてデータを保持しているテーブルに表示されない、すべてのルックアップ行に対して別のリストを作成したいと思います。

linqクエリ、または2つのデータテーブルで機能するものを使用したい

SQLNOTINを実行しているかのように。

乾杯

ここにいくつかのデータがあります。新しいリストにはカテゴリ4と5が含まれていると思います。

           DataTable dtData = new DataTable( "Data" );
        dtData.Columns.Add( "Id", Type.GetType( "System.Int32" ) );
        dtData.Columns.Add( "CategoryId", Type.GetType( "System.Int32" ) );
        dtData.Columns.Add( "Qty", Type.GetType( "System.Int32" ) );
        dtData.Columns.Add( "Cost", Type.GetType( "System.Decimal" ) );
        dtData.Columns.Add( "TotalCost", Type.GetType( "System.Decimal" ) );
        dtData.Columns.Add( "TypeId", Type.GetType( "System.Int32" ) );

        dtData.Rows.Clear();

        DataRow row = dtData.NewRow();
        row["Id"] = 1;
        row["CategoryId"] = 1;
        row["Qty"] = 3;
        row["Cost"] = 237.00;
        row["TotalCost"] = 711.00;
        row["TypeId"] = DBNull.Value;
        dtData.Rows.Add( row );

        row = dtData.NewRow();
        row["Id"] = 2;
        row["CategoryId"] = 1;
        row["Qty"] = 5;
        row["Cost"] = 45.00;
        row["TotalCost"] = 225.00;
        row["TypeId"] = DBNull.Value;
        dtData.Rows.Add( row );

        row = dtData.NewRow();
        row["Id"] = 3;
        row["CategoryId"] = 3;
        row["Qty"] = 30;
        row["Cost"] = 1.00;
        row["TotalCost"] = 30.00;
        row["TypeId"] = 1;
        dtData.Rows.Add( row );

        row = dtData.NewRow();
        row["Id"] = 4;
        row["CategoryId"] = 2;
        row["Qty"] = 1;
        row["Cost"] = 15.00;
        row["TotalCost"] = 15.00;
        row["TypeId"] = 2;
        dtData.Rows.Add( row );

        row = dtData.NewRow();
        row["Id"] = 5;
        row["CategoryId"] = 1;
        row["Qty"] = 4;
        row["Cost"] = 3.00;
        row["TotalCost"] = 12.00;
        row["TypeId"] = 2;
        dtData.Rows.Add( row );

        DataTable dtlookup = new DataTable( "LookUp" );
        dtlookup.Columns.Add( "CategoryId", Type.GetType( "System.Int32" ) );
        dtlookup.Columns.Add( "Description", Type.GetType( "System.String" ) );

        dtlookup.Rows.Clear();

        DataRow lup = dtlookup.NewRow();
        lup["CategoryId"] = 1;
        lup["Description"] = "Category 1";
        dtlookup.Rows.Add( lup );

        lup = dtlookup.NewRow();
        lup["CategoryId"] = 2;
        lup["Description"] = "Category 2";
        dtlookup.Rows.Add( lup );

        lup = dtlookup.NewRow();
        lup["CategoryId"] = 3;
        lup["Description"] = "Category 3";
        dtlookup.Rows.Add( lup );

        lup = dtlookup.NewRow();
        lup["CategoryId"] = 4;
        lup["Description"] = "Category 4";
        dtlookup.Rows.Add( lup );

        lup = dtlookup.NewRow();
        lup["CategoryId"] = 5;
        lup["Description"] = "Category 5";
        dtlookup.Rows.Add( lup );


 var qqq = ( from r in dtlookup.AsEnumerable()
                    where !dtData.AsEnumerable().Any( b => b["CategoryId"] == r["CategoryId"] )
                    select r ).ToList();
4

2 に答える 2

2

あなたを助けたのはdahlbykの答えだったと思うので、ここに貼り付けます。

データテーブルで選択されていないLinq


国のシーケンスで使用すると、例外が機能します。

System.Linq を使用します。...

var ccList = from c in ds.Tables[2].AsEnumerable()
             select c.Field<string>("Country"); 
var bannedCCList = from c in ds.Tables[1].AsEnumerable()
                   select c.Field<string>("Country");
var exceptBanned = ccList.Except(bannedCCList);

国が禁止されていない行全体が必要な場合は、左外部結合を試すことができます。

var ccList = ds.Tables[2].AsEnumerable();
var bannedCCList = ds.Tables[1].AsEnumerable();
var exceptBanned = from c in ccList
                   join b in bannedCCList
                     on c.Field<string>("Country") equals b.Field<string>("Country") into j
                   from x in j.DefaultIfEmpty()
                   where x == null
                   select c;
于 2012-06-27T07:37:34.000 に答える
0

DataTable.AsEnumerable() 拡張メソッドを使用して、データの列挙可能なコレクションを返すことができます。そこから、LINQ を使用して効果的にデータをクエリできます。

var myData = myDataTable.AsEnumerable()

編集:IDがデータテーブルに含まれているかどうかを判断する必要がある場合は、最初にIDのリストを選択する必要があります(DataRowオブジェクト全体を比較できないため)。

bool idExists = dtData
                    .AsEnumerable()
                    .Select(item => (int) item["Id"])
                    .Contains(myId);
于 2012-06-27T07:03:07.373 に答える