linq 更新列表元素并与列表合并

62o28rlo  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(161)

我在C#中尝试了这个。
| ID|实体名称|实体_值|截面_组|文件编号|组别编号|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 1|d数量|小行星220059090|第1组|四十|0|
| 二|t日期|2022年12月6日|第1组|四十|0|
| 三|d数量|小行星220059090|第2组|四十|0|
| 四|t日期|2022年12月6日|第2组|四十|0|
| 五|公司|血压||四十|0|
Section_group为空的列应合并到分组结果中,Group_Id列应使用增量值进行更新。
我期待得到如下。

ENTITY_NAME   ENTITY_VALUE SECTION_GROUP  DOC_ID      GROUP_ID
        dNumber     U220059090       GROUP 1      40     1
          tDate       6-Dec-22       GROUP 1      40     1
        sCompany            bp                    40     1

        dNumber     U220059090       GROUP 2      40     2
          tDate       6-Dec-22       GROUP 2      40     2
        sCompany            bp                    40     2

我创建了两个列表。第一个列表的section_group不为null,第二个列表的section_Group为null,并在第一个列表的section_group上应用了分组。

var itemSectionGroup = item.Where(x => !string.IsNullOrEmpty(x.Sectiongroup));
var itemSectionGroupNull = item.Where(x => string.IsNullOrEmpty(x.Sectiongroup)).ToList();
var group = itemSectionGroup.GroupBy(x => new { x.Sectiongroup });
int grp_num = 1;

foreach (var grp in group)
        {
            List<ParserRequestEntityLog> newList = itemSectionGroupNull.GetRange(0,itemSectionGroupNull.Count);
            grp.ToList().ForEach(x => x.Groupid = grp_num);
            newList.ToList().ForEach(x => x.Groupid = grp_num);
            resultList.AddRange(grp.ToList());
            resultList.AddRange(newList);
            grp_num += 1;
      }

由于引用类型,此代码的Group_Id被覆盖。我得到的是下面的错误。

ENTITY_NAME   ENTITY_VALUE SECTION_GROUP  DOC_ID      GROUP_ID
        dNumber     U220059090       GROUP 1      40     1
          tDate       6-Dec-22       GROUP 1      40     1
        sCompany            bp                    40     2 <= this is getting overridden. 

        dNumber     U220059090       GROUP 2      40     2
          tDate       6-Dec-22       GROUP 2      40     2
        sCompany            bp                    40     2

我正在寻找正确和有效的方法。

rkue9o1l

rkue9o1l1#

你需要使用AsNoTracking()方法来避免它被覆盖。这里是工作演示,希望它能给予你一些帮助:

型号

public class Item
    {
        public int Id { get; set; }
        public string ENTITY_NAME { get; set; }
        public string ENTITY_VALUE { get; set; }
        public string? SECTION_GROUP { get; set; }
        public int DOC_ID { get; set; }
        public int GROUP_ID { get; set; }
    }

联系我们

var itemSectionGroup = _dbcontext.item.Where(x => !string.IsNullOrEmpty(x.SECTION_GROUP));

           
var resultList = new List<Item>();          

var result =  itemSectionGroup.GroupBy(x => x.SECTION_GROUP).Select(x => x.Key).ToList();

for (int i = 0; i < result.Count(); i++)
    {
        var session1 = itemSectionGroup.Where(x => x.SECTION_GROUP == result[i]).ToList();
        var Nullsession = _dbcontext.item.Where(x => string.IsNullOrEmpty(x.SECTION_GROUP)).AsNoTracking().FirstOrDefault();
        session1.Add(Nullsession);
        session1.ForEach(x => x.GROUP_ID = (i + 1));
        resultList.AddRange(session1);
                
    };

演示:

stszievb

stszievb2#

一个简单的方法是将其序列化并反序列化以避免引用:
var cloneGroupNull = JsonConvert.DeserializeObject<List<Test>>(JsonConvert.SerializeObject(itemSectionGroupNull));

相关问题