如何通过另一个数据表行属性过滤 DataView

How to Filter a DataView by another datatable row attribute

我有 2 种方法无法控制。

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

 DataView allDatesWithCode= portal.GetAllDatesWithCode();

还有另一种方法returns我只有可用日期但没有代码。

DataTable availableDates = portal.GetAvailableDates();

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

如何使用 availableDates 过滤 allDatesWithCode 以仅包含可用代码的日期?

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

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

您可以使用 StringBuilder to create a RowFilter 作为您的 DataView:

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 在公共字段上连接两个集合。这将为您提供一个投影,其中仅包含两个集合中存在的行的所有 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 属性。您也可以创建自己的类型来存储结果。