我想使用linq
过滤数据表中的数据。
我的方案是我有一个元素数组,其中包含动态创建的日期,在数据表中我们有列id,date,etc.
我们必须检索包含数组
中所有日期的id前:
string[] arr={"10/10/2012","11/11/2012","9/9/2012"}
表:
ID date
1 10/10/2012
2 11/11/2012
1 9/9/2012
6 9/9/2012
3 9/9/2012
6 11/11/2012
1 11/11/2012
输出为1 - 因为只有id'1'具有所有数组元素。
要完成上述功能,我使用下面显示的Linq查询。但我真的失败了。
Dim volunteers As DataTable =
(From leftTable In dtavailableVolunteers.AsEnumerable()
Join rightTable In dtavailableVolunteers.AsEnumerable()
On leftTable.VolunteerId Equals rightTable.VolunteerId
Where SelectedDatesArray.All(Function(i) rightTable.Field(Of String)("SelectedDate").Equals(i.ToString()))
Select rightTable).CopyToDataTable()
答案 0 :(得分:0)
让我们说你的数据表是dt
DataRow[] dr = dt.Select("date in (" + string.join("," , arr) + ")");
string[] st = dr.Select(ss => ss["id"].ToString()).ToArray();
OR
DataTable newdt = dr.CopyToDataTable();
第二行是LINQ
答案 1 :(得分:0)
您可以按ID对行进行分组,然后查找其中的组:不存在该组日期不包含该元素的arr元素。我的意思是:
var result = from item in list
group item by item.ID into grouping
where !arr.Exists(date =>
!grouping.Select(x => x.Date).Contains(date))
select grouping.Key;
答案 2 :(得分:0)
这是另一个版本:
from volunteer in dtavailableVolunteers
group volunteer by volunteer.Id into g
let volunteerDates = g.Select(groupedElement=>groupedElement.date)
where arr.All(date=>volunteerDates.Contains(date))
select g.Key