C# 如何通过另一个datatable行属性筛选DataView

C# 如何通过另一个datatable行属性筛选DataView,c#,datatable,dataview,C#,Datatable,Dataview,我有两种我无法控制的方法 其中一个返回所有日期,并带有所需的唯一代码(行列行[code])作为DataView DataView allDatesWithCode= portal.GetAllDatesWithCode(); 另一个方法只返回可用日期,但不返回代码 DataTable availableDates = portal.GetAvailableDates(); allDatesWithCode和AvailableDates都有一个通用的日期列(行[日期]) 如何使用availa

我有两种我无法控制的方法

其中一个返回所有日期,并带有所需的唯一代码(行列
行[code]
)作为
DataView

 DataView allDatesWithCode= portal.GetAllDatesWithCode();
另一个方法只返回可用日期,但不返回代码

DataTable availableDates = portal.GetAvailableDates();
allDatesWithCodeAvailableDates都有一个通用的日期列(
行[日期]

如何使用
availableDates
过滤
allDatesWithCode
,使其仅具有带有代码的可用日期

DataView availableDatesWithCode = allDatesWithCode // (filtered by available date).
如果我可以控制
portal.GetAllDatesWithCode()
portal.GetAllDatesWithCode
这两个数据表
数据视图
会更好吗?

您可以使用为数据视图创建:

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个字段)(当您连接它们时)。然后,您可以使用
选择
将其进一步投影为只有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();
var res=(
来自DT.AsEnumerable()中的dtr
在所有日期中加入DataRowView dvr,dtr上的代码[“日期”]等于dvr[“日期”]
选择新的{Date=dtr.Field(“Date”),Code=((DataRowView)dvr.Row.Field(“Code”)}
).ToArray();

res
现在是匿名类型对象的数组(用于两个集合中存在的所有行)。每个匿名对象都有
Date
code
属性。您也可以创建自己的类型来存储结果。

并且allDatesWithCode是否有日期列?是的,有一列DateDT在第一行是什么?你能再检查一遍代码吗?DT是你的数据表(发音,Dee…Tee…:)。我已经更新了代码。只需复制并粘贴您的代码。看起来不太好。请参见上面的屏幕截图。:)@akdurmus:对不起,我在VB.NET中编写了代码,然后在本页上手动将其转换为C。我现在已经改正了。非常感谢。现在看来效果不错。但正如您对阵列所说,返回类型不再是DataView。基本上,这不会过滤allDatesWithCode。它生成一个新的数组,并显示结果。对吗?如果是,如何将此数组结果转换回DataView?这同样有效,但使用linq似乎更好更快。谢谢