我创建了一个类,如下所示,来表示复合主键模型:
public class PrimaryKeyModel
{
public string ColumnName { get; set; }
public string ColumnValue { get; set; }
public int RowNumber { get; set; } // always unique
}
它基本上表示共同构成主键的列的名称/值,加上该组合所属的行号;最初在电子表格中。
然后,我将此模型放入列表中,并用电子表格中的数据填充它:
List<PrimaryKeyModel> primaryKeysList = new List<PrimaryKeyModel>;
我想检查 PrimaryKeysList 并查看它是否有任何重复的值,如果有,我想知道这些值重复的行号。
我尝试了不同的方法,例如将此列表加载到 HashSet、字典中并使用这个解决方案在这里这个链接 https://stackoverflow.com/questions/6148809/how-to-linq-distinct-by-multiple-fields-without-anonymous-types但没有一个奏效。无论如何我可以解决这个问题吗?
Thanks.
更新 - 这是一个数据显示示例。 UniqueColumnsModel 与 PrimaryKeyModel 相同;我在这里更改了它以使其更清楚。
编辑:澄清问题
我正在尝试将数据从电子表格(可以有多种类型(一种用于销售,一种用于报价等))导入到数据库中。数据库中的配置表确定电子表格中的哪些列将构成目标表中的主键。我的任务是创建一个例程,在使用我的应用程序将电子表格数据上传(导入)到数据库之前对其进行验证。我想验证设置为主键组合的列不包含任何重复的数据,以便插入时目标表中不会违反主键约束。
这里提到的列表(PrimaryKeyModel)包含电子表格中列的名称(与其他列一起构成主键)、电子表格中列的值以及该值所在的电子表格中的行号。该列表通过 foreach 行/foreach 列循环填充。所以我希望这能更好地阐述这个问题。
GroupBy
对此效果很好:
primaryKeysList.GroupBy(pk => new {pk.ColumnName, pk.ColumnValue})
.Where(g => g.Count() > 1)
.SelectMany(g => g); // flatten the groups into a single list
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)