如何通过另一个数据表行属性过滤 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();
allDatesWithCode 和 availaleDates 都有一个共同的日期列 (row[date]
)。
如何使用 availableDates
过滤 allDatesWithCode
以仅包含可用代码的日期?
DataView availableDatesWithCode = allDatesWithCode // (filtered by available date).
而且如果我可以控制 portal.GetAllDatesWithCode()
和 portal.GetAllDatesWithCode
,那么将两者都设为 DataTable
或 DataView
会更好吗?
您可以使用 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
现在是匿名类型对象的数组(对于两个集合中存在的所有行)。每个匿名对象都有 Date
和 Code
属性。您也可以创建自己的类型来存储结果。
我有 2 种方法无法控制。
一个returns我所有需要唯一代码的日期(行列之一row[code]
)作为DataView
。
DataView allDatesWithCode= portal.GetAllDatesWithCode();
还有另一种方法returns我只有可用日期但没有代码。
DataTable availableDates = portal.GetAvailableDates();
allDatesWithCode 和 availaleDates 都有一个共同的日期列 (row[date]
)。
如何使用 availableDates
过滤 allDatesWithCode
以仅包含可用代码的日期?
DataView availableDatesWithCode = allDatesWithCode // (filtered by available date).
而且如果我可以控制 portal.GetAllDatesWithCode()
和 portal.GetAllDatesWithCode
,那么将两者都设为 DataTable
或 DataView
会更好吗?
您可以使用 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
现在是匿名类型对象的数组(对于两个集合中存在的所有行)。每个匿名对象都有 Date
和 Code
属性。您也可以创建自己的类型来存储结果。