2012-04-13 71 views
0

我想使用linq過濾數據表中的數據。C#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

比方說你的數據表是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

+0

這將使你匹配任何日期的標識。 OP的要求是匹配所有的日期。 – 2012-04-13 14:19:12

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; 
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