web-dev-qa-db-ja.com

LINQは2つのDataTableに参加します

こんにちはLINQを使用して2つのDataTablesを結合する問題があります。テーブルには次のような列があります。

table1        table2
ID, name       ID, stock
1, item1       1, 100
2, item2       3, 50
3, item3

Linqを使用してこのように参加しました。

DataTable dtResult = new DataTable();
dtResult.Columns.Add("ID", typeof(string));
dtResult.Columns.Add("name", typeof(string));
dtResult.Columns.Add("stock", typeof(int));

var result = from dataRows1 in table1.AsEnumerable()
             join dataRows2 in table2.AsEnumerable()
             on dataRows1.Field<string>("ID") equals dataRows2.Field<string>("ID")

             select dtResult.LoadDataRow(new object[]
             {
                dataRows1.Field<string>("ID"),
                dataRows1.Field<string>("name"),
                dataRows2.Field<int>("stock"),
              }, false);
result.CopyToDataTable();

問題は、表2にあるIDのみが結果に表示されることです。

dtResult
ID, name, stock
1, item1, 100
3, item3, 50

不足しているアイテムも表示する必要があります。これは望ましい結果です:

dtResult
ID, name, stock
1, item1, 100
2, item2, 0  //Prefer if it is "0", otherwise can be left "null"
3, item3, 50

左外部結合を行うべきだと思いますが、linqについての十分な知識がありません。感謝します。ありがとうございました!

21
user1080533

これにより、table2に行が存在しない場合、デフォルトで0になります。

var result = from dataRows1 in table1.AsEnumerable()
             join dataRows2 in table2.AsEnumerable()
             on dataRows1.Field<string>("ID") equals dataRows2.Field<string>("ID") into lj
             from r in lj.DefaultIfEmpty()
             select dtResult.LoadDataRow(new object[]
             {
                dataRows1.Field<string>("ID"),
                dataRows1.Field<string>("name"),
                r == null ? 0 : r.Field<int>("stock")
              }, false);

MSDN ソース

27
Sven Grosen

これを試して:

var result =
from dataRows1 in table1.AsEnumerable()
join dataRows2 in table2.AsEnumerable() on dataRows1.ID  equals dataRows2.ID into ps
from r in ps.DefaultIfEmpty()
select new { C= dataRows1 , r == null ? 0 : dataRows2.Stock};
4
Masoume Karvar

これを試して

var result =
    from dataRows1 in table1.AsEnumerable()
    join dataRows2 in table2.AsEnumerable()
    on dataRows1.Field<string>("ID") equals dataRows2.Field<string>("ID") into lj
    from r in lj.DefaultIfEmpty()
    select dtResult.LoadDataRow(new object[]
    {
        dataRows1.Field<string>("ID"),
        dataRows1.Field<string>("name"),
        r == null ? 0 : dataRows2.Field<int>("stock")
    }, false);
2

join..into句 を使用するだけです

var result = from dataRows1 in table1.AsEnumerable()
         join dataRows2 in table2.AsEnumerable()
         on dataRows1.Field<string>("ID") equals dataRows2.Field<string>("ID") into rows
         from row in rows.DefaultIfEmpty()
         select dtResult.LoadDataRow(new object[]
         {
            dataRows1.Field<string>("ID"),
            dataRows1.Field<string>("name"),
            row==null? null : row.Field<int>("stock"),
          }, false);
2
Grundy