如何在强类型DataTable对象上执行Linq“First”查询?

时间:2010-10-14 09:14:39

标签: c# linq strongly-typed-dataset

我正在尝试在类型化的DataTable上执行简单的Linq“查找第一个”查询,但似乎无法使语法正确。

(如果我不使用类型化数据表/行对象,那么工作正常。)

我有这个......

class Program
{
  static void Main(string[] args)
  {
     MyDataTable table = new MyDataTable("table");

     table.Rows.Add(1, "Hello");
     table.Rows.Add(2, "There");
     table.Rows.Add(1, "World");
     table.Rows[0].Delete();

     Func<MyDataRow, Boolean> func = (row) => row.One == 1;

     var row1 = table.AsEnumerable().First(func);
  }

  private class MyDataTable : DataTable
  {
     public MyDataTable()
     {
        this.Columns.Add("One", typeof(Int32));
        this.Columns.Add("Two", typeof(String));
     }
     public MyDataTable(String tableName) : this() { this.TableName = tableName; }

     protected override Type GetRowType()
     {
        return typeof(MyDataRow);
     }

     protected override DataRow NewRowFromBuilder(DataRowBuilder builder)
     {
        return new MyDataRow(builder);
     }

     public IEnumerable<MyDataRow> AsEnumerable()
     {
        foreach (MyDataRow row in this.Rows)
        {
           yield return row;
        }
     } 
  }

  private class MyDataRow : DataRow
  {
     internal MyDataRow(DataRowBuilder builder) : base(builder) { }
     public int One
     {
        set { this["One"] = value; }
        get { return Convert.ToInt32(this["One"]); }
     }
     public String Two
     {
        set { this["Two"] = value; }
        get { return Convert.ToString(this["Two"]); }
     }
  }
}

我也试过这个(显然没有用);

  private class MyDataTable : DataTable
  {
       :
     public EnumerableRowCollection<MyDataRow> AsEnumerable()
     {
        return base.AsEnumerable();
     }

  }

所以,我的问题是:

为了使用Linq确定类型化数据表中是否存在一个或多个记录,我需要实现什么?例如,我是否需要覆盖“AsEnumerable”,或者我可以在MyDataTable类上编写“First”方法吗?

或者我是否必须做一些像将DataMable强制转换为DataTable并将行视为DataRow对象的事情?

谢谢,

3 个答案:

答案 0 :(得分:2)

使用CastIEnumerable转换为强类型IEnumerable<T>

答案 1 :(得分:0)

首先,您的代码似乎在这里工作。 row1不为空。

如果要检查记录是否存在,可以使用Linq方法Any(r =&gt; r.One == 1)。

答案 2 :(得分:0)

您可以引用程序集AsEnumerable( )

,而不是编写自己的System.Data.DataSetExtensions实现

然后你可以这样做:

table.AsEnumerable( ).Where( item => item.Field<int>( "One" ) == 1 ).First( );

您需要关注using语句:

using System.Data.Linq;
using System.Linq;