【问题标题】:C# Linq filter DataTable using array elementsC# Linq 使用数组元素过滤 DataTable
【发布时间】:2012-04-13 13:26:11
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    假设您的数据表是 dt

    DataRow[] dr = dt.Select("date in (" + string.join("," , arr) + ")");
    
    string[] st = dr.Select(ss => ss["id"].ToString()).ToArray();
    

    DataTable newdt = dr.CopyToDataTable();
    

    第二行是LINQ

    【讨论】:

    • 这将为您提供与任何日期匹配的 ID。 OP 的要求是匹配所有日期。
    【解决方案2】:

    您可以按 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;
    

    【讨论】:

      【解决方案3】:

      这是另一个版本:

      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
      

      【讨论】:

        猜你喜欢
        • 2021-07-22
        • 1970-01-01
        • 2014-01-05
        • 2017-01-04
        • 1970-01-01
        • 2021-01-01
        • 1970-01-01
        • 2013-07-13
        相关资源
        最近更新 更多