使用where子句C#从datatable中选择特定行

时间:2014-01-28 14:48:25

标签: c#

我有一个数据表dt_Customers,其中包含Customer_IDEmail和其他一些数据。有些电子邮件在此数据表中是重复的,这意味着它们重复2,3次或更多次。

我使用以下选项在列表中选择了不同的电子邮件:

List<string> Email = dt_Customers.AsEnumerable().Select(r => r.Field<string>("Email")).Distinct().ToList(); 

对照现在列表中的这些选定电子邮件。是否可以从数据表中选择Customer_ID

或者我必须编写SQL查询,该查询将从列表中选定的电子邮件ID中获取SQL Server数据库中的数据。

3 个答案:

答案 0 :(得分:2)

  

或者我必须编写SQL查询,它将从SQL Server获取数据   数据库针对列表中选定的电子邮件ID。

不,您不必再从数据库中获取它们,您已经在DataTable中拥有它们。您可以使用以下查询来查看内存中DataTable的电子邮件列表,例如:

List<int> customerIDs = dt_Customers.AsEnumerable()
                            .Where(r => Email.Contains(r.Field<string>("Email")))
                            .Select(r => r.Field<int>("Customer_ID"))
                            .ToList();

答案 1 :(得分:1)

不幸的是LINQ中没有DistinctBy方法,here是解决方法和自定义扩展方法

var customerIds = dt_Customers.AsEnumerable()
                              .GroupBy(r => r.Field<string>("Email"))
                              .Select(g => g.First().Field<int>("Customer_ID"))
                              .ToList();

答案 2 :(得分:0)

您可以按Email进行分组,然后从该群组中选择所有Customer_ID

var emails = dt_Customers.AsEnumerable().GroupBy(dr => dr.Field<string>("Email"));
foreach (var emailGroup in emails)
{
    var email = emailGroup.Key;
    var ids = emailGroup.Select(dr => dr.Field<int>("Customer_ID "]));
}