嵌套列表 linq 中的条件

本文关键字:条件 linq 列表 嵌套 | 更新日期: 2023-09-27 18:33:55

>我有两个类

  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。表[1]和ds。表格[2]

我正在将两个数据集中的数据转换为项目类列表,其中还包含项目代码类列表

我正在做的如下

 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。表[2]行对每行ds。表[1]

但我只想要那些行 LineID 为 ds 的行。表[1]与ds的行ID匹配。表[2],我必须更改条件

嵌套列表 linq 中的条件

我直言,一个更干净的解决方案(这也提高了大型数据集的性能)是首先创建子项的查找,然后组装父项:

        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 子句并将其与数据行中的 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 不同。在这里,数据已经从您的数据库中获取,并填充在数据集的数据表中。您必须执行 AsEnumerable 的原因是 DataTable 没有实现 IEnumerable并且所有 Linq 查询仅适用于 IEnumerable 类型。

如果你想要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();