LINQ (Language Integrated Query) 是.NET框架中的一组技术,它允许开发者使用类似SQL的语法直接在C#或VB.NET代码中查询数据。当需要从数据表中获取基于多列的唯一行时,LINQ提供了几种方法来实现。
// 自定义比较器类
public class MultiColumnComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
// 比较多列的值
return x["Column1"].Equals(y["Column1"]) &&
x["Column2"].Equals(y["Column2"]) &&
x["Column3"].Equals(y["Column3"]);
}
public int GetHashCode(DataRow obj)
{
// 组合多列的哈希码
return obj["Column1"].GetHashCode() ^
obj["Column2"].GetHashCode() ^
obj["Column3"].GetHashCode();
}
}
// 使用示例
DataTable dt = GetDataTable(); // 获取数据表
var distinctRows = dt.AsEnumerable().Distinct(new MultiColumnComparer());
DataTable dt = GetDataTable();
var distinctRows = dt.AsEnumerable()
.GroupBy(row => new {
Column1 = row["Column1"],
Column2 = row["Column2"],
Column3 = row["Column3"]
})
.Select(group => group.First());
DataTable dt = GetDataTable();
var distinctRows = dt.AsEnumerable()
.Select(row => new {
Column1 = row["Column1"],
Column2 = row["Column2"],
Column3 = row["Column3"]
})
.Distinct();
问题:为什么Distinct()没有去除重复行? 原因:DataRow默认比较的是引用而不是内容 解决方案:使用自定义比较器或GroupBy方法
问题:如何忽略某些列的大小写差异? 解决方案:在比较器中添加StringComparison参数:
return string.Equals(x["Column1"].ToString(), y["Column1"].ToString(), StringComparison.OrdinalIgnoreCase);
问题:如何将结果转换回DataTable? 解决方案:
DataTable result = distinctRows.CopyToDataTable();