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

时间:2015-05-20 10:23:06

标签: c# datatable dataview

我有两种方法,我无法控制。

我将所有日期与所需的唯一代码(行列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,那么将DataTableDataView设为最好吗? enter image description here

2 个答案:

答案 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现在是一个匿名类型对象的数组(对于两个集合中存在的所有行)。每个匿名对象都有DateCode属性。您也可以创建自己的类型来存储结果。

答案 1 :(得分:0)

您可以使用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,并创建一个新方法,只为您提供首先需要的行。< / p>