[英]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.