簡體   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