C#Linq使用数组元素过滤DataTable

时间:2012-04-13 13:26:12

标签: c# asp.net vb.net linq

我想使用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()

3 个答案:

答案 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