[英]How to Filter a DataView by another datatable row attribute
我有2种方法无法控制。
会以DataView
的形式向我返回所有具有所需唯一代码(行列row[code]
)的日期。
DataView allDatesWithCode= portal.GetAllDatesWithCode();
另一种方法仅向我返回可用日期,而没有代码。
DataTable availableDates = portal.GetAvailableDates();
既allDatesWithCode和availaleDates具有共同的日期栏( row[date]
)。
如何过滤具有availableDates
allDatesWithCode
以使仅具有代码的可用日期?
DataView availableDatesWithCode = allDatesWithCode // (filtered by available date).
而且,如果我可以控制portal.GetAllDatesWithCode()
和portal.GetAllDatesWithCode
是否可以同时作为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
属性。 您也可以创建自己的类型来存储结果。
您可以使用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
,并且还建议您创建一个新方法,该方法将只为您提供所需的行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.