【问题标题】:LINQ Query on Datatable to check if record exists对数据表进行 LINQ 查询以检查记录是否存在
【发布时间】:2011-05-23 06:25:34
【问题描述】:

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

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

P.S : 我在 vs 2010 中使用 c#

【问题讨论】:

标签: c# linq


【解决方案1】:

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>

【讨论】:

  • @paradox p 是 dataTable.AsEnumerable() 的对象
【解决方案2】:

您不能使用该方法,因为DataRowCollection 没有实现IEnumerable<T>。您需要使用AsEnumerable() 扩展名:

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

您可能还需要对 System.Data.DataSetExtensions 的项目引用才能使其正常工作。

祝你好运!

【讨论】:

    【解决方案3】:

    如果你有这样的表:

    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"所在的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多