【问题标题】:How to perform a Linq "First" query on a strongly-typed DataTable object?如何对强类型 DataTable 对象执行 Linq“第一次”查询?
【发布时间】:2010-10-14 09:14:38
【问题描述】:

我正在尝试对类型化的 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”方法?

或者我是否必须做一些笨拙的事情,比如将 MyDataTable 转换为 DataTable 并将行视为 DataRow 对象?

谢谢,

【问题讨论】:

    标签: c# linq strongly-typed-dataset


    【解决方案1】:

    使用CastIEnumerable 转换为强类型IEnumerable&lt;T&gt;

    【讨论】:

    • 他的函数中返回的 IEnumerable 已经是强类型的,否则代码将无法编译,因为 .One 将是未知的。
    【解决方案2】:

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

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

    【讨论】:

    • 我很抱歉。花了一段时间才达到这一点,我一定错过了它编译的点。
    【解决方案3】:

    您可以引用程序集System.Data.DataSetExtensions,而不是编写自己的AsEnumerable( ) 实现

    那么你可以这样做:

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

    您需要遵循using 声明:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2012-02-08
      • 1970-01-01
      • 2013-11-22
      • 2022-01-11
      • 1970-01-01
      • 2010-12-18
      相关资源
      最近更新 更多