簡體   English   中英

嵌套列表linq中的條件

[英]where condition inside nested list linq

我有兩節課

  public class Item
  {
    public string LineID{ get; set; }
    public string ItemNo{ get; set; }
    public List<Itemcode> ItemcodeList{ get; set; }
  }

  public class Itemcode
   {
      public string LineID{ get; set; }
      public string code { get; set; }
      public string codeValue { get; set; }
   }

和兩個數據表ds.Tables [1]和ds.Tables [2]

我將數據從兩個數據集中轉換為Item類的列表,其中還包含Itemcode類的列表

我在做什么如下

 List<Item> items = ds.Tables[1].AsEnumerable().Select(dataRow => new Item
                    {
                        LineID= Convert.ToString(dataRow.Field<int>("LineID")),
                        ItemNo= dataRow.Field<string>("ItemNo"),
                        ItemcodeList = ds.Tables[2].AsEnumerable().Select(row => new Itemcode
                        {
                            code= Convert.ToString(row.Field<string>("code")),
                            codeValue = Convert.ToString(row.Field<string>("codeValue")),
                        }).ToList()
                    }).ToList();

上面的代碼針對ds.Table [1]的每一行給出了所有ds.Tables [2]行

但是我只需要ds.Table [1]的LineID與ds.Table [2]的LineID匹配的那些行,我必須在其中更改條件

恕我直言,一種更清潔的解決方案(還可以改善大數據集的性能)是首先創建子項的查找,然后組裝父項:

        var itemCodes = (
            from dataRow in ds.Tables[2].AsEnumerable()
            select new Itemcode
            {
                LineID = dataRow.Field<string>("LineID"),
                code = dataRow.Field<string>("code"),
                codeValue = dataRow.Field<string>("code")
            }).ToLookup(ic => ic.LineID);

        var lines = (
            from dataRow in ds.Tables[1].AsEnumerable()
            let lineID = dataRow.Field<string>("LineID")
            select new Item
            {
                LineID = lineID,
                ItemNo = dataRow.Field<string>("ItemNo"),
                ItemcodeList = itemCodes[lineID].ToList()
            }).ToList();

或者,如果您更喜歡方法鏈語法:

        var itemCodes = ds.Tables[2].AsEnumerable().Select(dataRow => new Itemcode
        {
            LineID = dataRow.Field<string>("LineID"),
            code = dataRow.Field<string>("code"),
            codeValue = dataRow.Field<string>("code")
        }).ToLookup(ic => ic.LineID);

        var lines = ds.Tables[1].AsEnumerable()
            .Select(dataRow => new {dataRow, lineID = dataRow.Field<string>("LineID")})
            .Select(item => new Item
            {
                LineID = item.lineID,
                ItemNo = item.dataRow.Field<string>("ItemNo"),
                ItemcodeList = itemCodes[item.lineID].ToList()
            }).ToList();

我認為在這里使用組聯接將是一個很好的解決方案。

var items= (from tbl1 in ds.Tables[1].AsEnumerable()
            join tbl2 in ds.Tables[2].AsEnumerable()
              on tbl1.Field<int>("LineId") equals tbl2.Field<int>("LineID") into g
            select new Item
            {
               LineID = tbl1.Field<int>("LineID").ToString(),
               ItemNo = tbl1.Field<string>("ItemNo"),
               ItemcodeList = g.Select(row => 
                  new Itemcode
                  {
                     code = row.Field<string>("code").ToString(),
                     codeValue = row.Field<string>("codeValue").ToString(),
                  }).ToList()
            }).ToList();

只需添加where子句並將其與datarow中的LineId進行比較

List<Item> items = ds.Tables[1].AsEnumerable().Select(dataRow => new Item
                    {
                        LineID= Convert.ToString(dataRow.Field<int>("LineID")),
                        ItemNo= dataRow.Field<string>("ItemNo"),
                        ItemcodeList = ds.Tables[2].AsEnumerable().Where(ic=>ic.Field<int>("LineId")==dataRow.Field<int>("LineID")).Select(row => new Itemcode
                        {
                            code= Convert.ToString(row.Field<string>("code")),
                            codeValue = Convert.ToString(row.Field<string>("codeValue")),
                        }).ToList()
                    }).ToList();

附加信息

這里的AsEnumerable與AsQueryable有所不同。...這里的數據已經從數據庫中獲取,並已填充到DataSet的DataTable中。...之所以要做AsEnumerable,是因為DataTable不實現IEnumerable <T>並且所有Linq查詢僅適用於IEnumerable <T>類型。

如果您要使用lambda解決方案,則應執行以下操作:

List<Item> items =
            ds.Tables[0].AsEnumerable().GroupJoin(
            ds.Tables[1].AsEnumerable(),
            tab1 => tab1.Field<int>("LineID"),
            tab2 => tab2.Field<int>("LineID"),
            (tab1, tab2) => new Item
                        {
                            LineID = Convert.ToString(tab1.Field<int>("LineID")),
                            ItemNo = tab1.Field<string>("ItemNo"),
                            ItemcodeList = tab2.AsEnumerable().SelectMany(codes=> 
                                new List<Itemcode>                                   
                                {
                                    new Itemcode { code = codes.Field<string>("Code")} 
                                }
                            ).ToList()
                        }
            ).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM