DataTable从多个列中选择不同的值
本文关键字:选择 DataTable | 更新日期: 2023-09-27 18:08:41
一如既往,我需要你的帮助:)
我得到了一个DataTable
,它有以下列:
TITLE ADDRESS BRANCH BRANCH1 BRANCH2 BRANCH3
因为我不想执行另一个MySql查询只获得分支,我想我可以在DataTable
上做一个LINQ
查询,并得到不同的值。
如果我不清楚的话,我需要所有行中的所有分支
试试这个:-
var rows = dataTable.AsEnumerable();
rows.Select(x => x["BRANCH"])
.Union(rows.Select(x => x["BRANCH1"]))
.Union(rows.Select(x => x["BRANCH2"]))
.Union(rows.Select(x => x["BRANCH3"]));
这将从表中的所有BRANCH列中获取所有值,并使用Union()
a)将它们连接到单个列表中,b)删除重复项,为您提供不同的值。
(注意:Union()
函数删除重复的值。为了保留重复项,可以使用Concat()
来代替Union()
—EDIT—
如果要丢弃空值,请使用Where()
,例如:-
var rows = dataTable.AsEnumerable();
rows.Select(x => x["BRANCH"])
.Union(rows.Select(x => x["BRANCH1"]))
.Union(rows.Select(x => x["BRANCH2"]))
.Union(rows.Select(x => x["BRANCH3"]))
.Where(x => x != null);
定义自己的IEqualityComparer
public class MyComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y) {
// logic to distinguish the branches
// this is just an example.
return x["BRANCH"] == y["BRANCH"]
&& x["BRANCH1"] == y["BRANCH1"]
&& x["BRANCH2"] == y["BRANCH2"]
&& x["BRANCH3"] == y["BRANCH3"];
}
public int GetHashCode(DataRow obj) {
// logic to distinguish the branches
// this is just an example.
return obj["BRANCH"].GetHashCode() +
obj["BRANCH1"].GetHashCode() +
obj["BRANCH2"].GetHashCode() +
obj["BRANCH3"].GetHashCode() ;
}
}
并使用
var result = dataTable.AsEnumerable().Distinct(new MyComparer());