繁体   English   中英

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

[英]How to Filter a DataView by another datatable row attribute

我有2种方法无法控制。

会以DataView的形式向我返回所有具有所需唯一代码(行列row[code] )的日期。

 DataView allDatesWithCode= portal.GetAllDatesWithCode();

另一种方法仅向我返回可用日期,而没有代码。

DataTable availableDates = portal.GetAvailableDates();

allDatesWithCodeavailaleDates具有共同的日期栏( row[date] )。

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

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

而且,如果我可以控制portal.GetAllDatesWithCode()portal.GetAllDatesWithCode是否可以同时作为DataTableDataView更好? 在此处输入图片说明

使用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属性。 您也可以创建自己的类型来存储结果。

您可以使用StringBuilderDataView创建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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM