2

「dst」と「dst2」という名前の 2 つのデータテーブルがあります。それらはデータセット「urenmat」にあります。データのマヨリティは 'dst' です。ただし、これには「werknemer」という名前の列が含まれています。「dst2」の特定の行に対応する値が含まれています。この列の名前は「数値」です。

私が必要としているのは、dst.werknemer と dst2.nummer がリンクされている両方のデータテーブルを左外部結合する方法であり、「dst.werknemer」にリンクされた「dst2.naam」と「dst.werknemer」の他のすべての列を含む新しいデータテーブルが作成されます。 「dst」。

私はいたるところを見てきましたが、私の質問に対する正しい答えを見つけることができないようです。いくつかのサイトでは、この状況で LINQ を使用する方法が提供されています。私はLINQを使ってみましたが、私はこれに熟練していません。

101 の LINQ サンプルを使用してみました: http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

urenmat = dataset.
dst =  a, b, c, d, werknemer.
dst2 = nummer, naam.

「101」の次のコードを使用しました。

            var query =
            from contact in dst.AsEnumerable()
            join order in dst2.AsEnumerable()
            on contact.Field<string>("werknemer") equals
            order.Field<string>("nummer")
            select new
            {
                a = order.Field<string>("a"),
                b = order.Field<string>("b"),
                c = order.Field<string>("c"),
                d = order.Field<string>("d"),
                naam = contact.Field<decimal>("naam")};

ただし、「連絡先」と「注文」を何に変更すればよいかわかりません。また、データテーブルに再度保存する方法がわかりません。

これらがばかげた質問である場合は非常に申し訳ありませんが、自分で解決しようとしましたが、ばかげているようです:P. 事前に助けてくれてありがとう!

PS。コードに C# を使用しています。データセットとデータテーブルが型指定されています。

4

1 に答える 1

0

dst左外部結合の投影データセットを生成するdst2場合は、この LINQ 式を使用できます (申し訳ありませんが、LINQ クエリ構文では実際には機能しないため、代わりにこのラムダ構文を使用する必要があります)。

var query = dst.AsEnumerable()
    .GroupJoin(dst2.AsEnumerable(), x => x.Field<string>("werknemer"), x => x.Field<string>("nummer"), (contact, orders) => new { contact, orders })
    .SelectMany(x => x.orders.DefaultIfEmpty(), (x, order) => new
    {
        a = order.Field<string>("a"),
        b = order.Field<string>("b"),
        c = order.Field<string>("c"),
        d = order.Field<string>("d"),
        naam = x.contact.Field<decimal>("naam")
    });

これは射影されたデータセットであるため、データテーブルに単純に保存することはできません。保存が必要な場合は、影響を受ける行をロードし、目的のフィールドを更新してから、変更を保存します。

// untyped
var row = dst.Rows.Find(keyValue);
// typed
var row = dst.FindBy...(keyValue);

// update the field
row.SetField("a", "some value");
// save only this row's changes
row.AcceptChanges();

// or after all changes to the table have been made, save the table
dst.AcceptChanges();

通常、(投影された) データの読み込みと保存を実行する必要がある場合は、ORM (エンティティ フレームワークや LINQ-to-SQL など) が最適なツールになります。ただし、DataTableこの場合は を使用しており、これらに ORM をリンクできるかどうかはわかりません (ただし、おそらく可能だと思われます)。

于 2014-08-20T15:42:27.157 に答える