DataTable从多个列中选择不同的值

本文关键字:选择 DataTable | 更新日期: 2023-09-27 18:08:41

一如既往,我需要你的帮助:)

我得到了一个DataTable,它有以下列:

TITLE ADDRESS BRANCH BRANCH1 BRANCH2 BRANCH3

因为我不想执行另一个MySql查询只获得分支,我想我可以在DataTable上做一个LINQ查询,并得到不同的值。

男孩,我错了…它不像我想象的那么简单。 有谁能帮我一下吗?(首选Lambda表达式) 编辑:

如果我不清楚的话,我需要所有行中的所有分支

DataTable从多个列中选择不同的值

试试这个:-

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());