4

私はLinqが初めてで、これを機能させることができませんでした。

public class ItemMaster
{
   public int ItemId{ get; set; }  
   //other fields
   public IList<ItemDetail> Details { get; set; }     
}

public class ItemDetail
{
   public int DetailId{ get; set; }  ;
   public int ItemId{ get; set; }  ;
   //other fields
}

私のViewModelは

DataTable dtMaster = da.GetItemsMasterDataTable();
DataTable dtDetail = da.GetItemsDetailDataTable();

var list = (from m in dtMaster.AsEnumerable()                                                 
           select new ItemMaster
           {
              ItemId = m.Field<int>("ItemId"),
              //other fields
              Details = (from d in dtDetail.AsEnumerable()
                         where d["ItemId"] == m["ItemId"]
                         select new ItemDetail
                         {
                             DetailId = d.Field<int>("DetailId"),
                             ItemId = d.Field<int>("ItemId")
                             //other fields
                          }).ToList()
            }).ToList();   

リストはすべてのマスター アイテムを取得しますが、詳細数は常にゼロです。したがって、ネストされた選択は機能しません。助けてください!ありがとう。

4

1 に答える 1

0

トーマスが言うように、

row["columnName"] 構文を使用してフィールドにアクセスすると、値の型がボックス化されます。そのように == 演算子は、実際の値を比較する Equals とは対照的に参照比較を行います。

次のコードを検討してください

object foo = 1;
object bar = 1;

// outputs False
Console.WriteLine(foo == bar);
// outputs True
Console.WriteLine(foo.Equals(bar));
// outputs True
Console.WriteLine((int)foo == (int)bar);

だからあなたのどこの条件をから変えてください

where d["ItemId"] == m["ItemId"]

どちらかに

where Equals(d["ItemId"], m["ItemId"])

また

where d.Field<int>("ItemId") == m.Field<int>("ItemId")
于 2012-04-26T15:17:57.427 に答える