LINQ查询数据表以检查记录是否存在

时间:2011-05-23 06:25:34

标签: c# linq

我想对名为Records的数据表执行LINQ查询,并检查是否存在记录。如果它存在,我想找出它所在的行。我怎么能这样做呢?

我想在添加system.linq命名空间后在我的数据表上执行.where但该方法似乎不存在。请指教

P.S:我在2010年使用c#

3 个答案:

答案 0 :(得分:5)

DataTable不是默认使用Enumerable。你必须转换为

  var result = from p in dataTable.AsEnumerable()
     where p.Field("ID") == 2
    select p.Field("Name");

   if(result.Any())
   {
      //do your work
    }

阅读本文

http://blogs.msdn.com/b/adonet/archive/2007/01/26/querying-datasets-introduction-to-linq-to-dataset.aspx

了解您使用Field<T>

答案 1 :(得分:3)

您无法使用此方法,因为DataRowCollection未实现IEnumerable<T>。您需要使用AsEnumerable()扩展程序:

var dataRowQuery= myDataTable.AsEnumerable().Where(row => ...

您可能还需要对System.Data.DataSetExtensions的项目引用才能实现此目的。

祝你好运!

答案 2 :(得分:0)

如果你有一个表格,如:

DataTable dt = new DataTable();

dt.Columns.Add("rownum", typeof(Int32));
dt.Columns.Add("val", typeof(String));

dt.Rows.Add(1, "a");
dt.Rows.Add(2, "b");
dt.Rows.Add(3, "c");

然后,

Console.WriteLine(
                dt.Rows.IndexOf(dt.AsEnumerable().Where(c => c.Field<String>(1) == "d").FirstOrDefault())); // `1:= index of column

会导致-1,因为找不到"d"。但是,

Console.WriteLine(
                dt.Rows.IndexOf(dt.AsEnumerable().Where(c => c.Field<String>(1) == "b").FirstOrDefault())); // `1:= index of column

会产生1,代表"b"所在的行。