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

时间:2011-09-13 18:34:36

标签: c# linq lambda datatable

总之我需要你的帮助:)。

我有DataTable,其中包含以下列:

TITLE ADDRESS BRANCH BRANCH1 BRANCH2 BRANCH3

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

男孩,我错了......我认为它不会那么简单。

任何人都可以帮助我吗? (Lambda表达首选)

编辑:

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

2 个答案:

答案 0 :(得分:4)

试试这个: -

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

---编辑---

如果要丢弃空值,请使用用户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);

答案 1 :(得分:1)

定义您自己的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());