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();
allDatesWithCode和AvailableDates都有一个通用的日期列(行[日期]
)
如何使用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似乎更好更快。谢谢