【问题标题】:How to Filter a DataView by another datatable row attribute如何通过另一个数据表行属性过滤 DataView
【发布时间】:2015-05-20 10:23:05
【问题描述】:

我有两种我无法控制的方法。

一个返回给我所有需要唯一代码的日期(行列row[code]之一)为DataView

 DataView allDatesWithCode= portal.GetAllDatesWithCode();

另一种方法只返回可用日期,但没有代码。

DataTable availableDates = portal.GetAvailableDates();

allDatesWithCodeavailaleDates 都有一个共同的日期列 (row[date])。

如何过滤 allDatesWithCodeavailableDates 以仅提供带代码的可用日期?

DataView availableDatesWithCode = allDatesWithCode // (filtered by available date).

如果我可以控制portal.GetAllDatesWithCode()portal.GetAllDatesWithCode,将两者都设置为DataTableDataView 会更好吗?

【问题讨论】:

  • 而且 allDatesWithCode 是否有任何日期列?
  • 是的,有一个日期列

标签: c# datatable dataview


【解决方案1】:

使用 LINQ 连接公共字段上的两个集合。这将为您提供一个包含所有 3 个字段(DataTable 的 1 个字段和 DataView 的 2 个字段)的投影,仅适用于两个集合中存在的行(当您加入它们时)。然后,您可以使用 Select 将其进一步投影为只有 2 个字段。一个例子是:

var res = (
              from dtr in DT.AsEnumerable()
              join DataRowView dvr in allDatesWithCode on dtr["date"] equals dvr["date"]
              select new {Date = dtr.Field<DateTime>("date"), Code = ((DataRowView)dvr).Row.Field<string>("code") }
          ).ToArray();

res 现在是一个匿名类型对象数组(适用于两个集合中存在的所有行)。每个匿名对象都有DateCode 属性。您也可以创建自己的类型来存储结果。

【讨论】:

  • 第一行的DT是什么?你能再检查一下代码吗?
  • DT 是您的 DataTable(发音,Dee...Tee... :))。我已经更新了代码。
  • 只需复制并粘贴您的代码。好像不行。请看上面的截图。 :)
  • @akdurmus:抱歉,我在 VB.NET 中编写了代码,然后在此页面上将其手动转换为 C#。我现在已经更正了。
  • 谢谢 很多现在似乎工作正常。但是,正如您对 ToArray 所说,返回类型不再是 DataView。基本上这不会过滤 allDatesWithCode。它会生成一个带有结果的新数组。那是对的吗?如果是,如何将此数组结果转换回 DataView?
【解决方案2】:

您可以使用StringBuilder 为您的DataView 创建一个RowFilter

StringBuilder RowFilter = new StringBuilder("date IN(");
foreach(DataRow dr in availaleDates.Rows) {
    RowFilter.Append(dr["date"].ToString()).Append(",");
}
allDatesWithCode.RowFilter = RowFilter.ToString().TrimEnd(',') +")";

如果您可以控制这些方法,那么我建议返回 DataTable 而不是 DataView,并创建一个新方法,首先只为您提供所需的行。

【讨论】:

  • 这也有效,但使用 linq 似乎更好更快。谢谢
猜你喜欢
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
相关资源
最近更新 更多