我有两种方法,我无法控制。
我将所有日期与所需的唯一代码(行列row[code]
之一)作为DataView
返回给我。
DataView allDatesWithCode= portal.GetAllDatesWithCode();
另一种方法只返回可用日期但没有代码。
DataTable availableDates = portal.GetAvailableDates();
allDatesWithCode 和 availableleDates 都有一个公共日期列(row[date]
)。
如何使用allDatesWithCode
过滤availableDates
只包含代码的可用日期?
DataView availableDatesWithCode = allDatesWithCode // (filtered by available date).
如果我可以控制portal.GetAllDatesWithCode()
和portal.GetAllDatesWithCode
,那么将DataTable
或DataView
设为最好吗?
答案 0 :(得分: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
现在是一个匿名类型对象的数组(对于两个集合中存在的所有行)。每个匿名对象都有Date
和Code
属性。您也可以创建自己的类型来存储结果。
答案 1 :(得分:0)
您可以使用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
,并创建一个新方法,只为您提供首先需要的行。< / p>