Как выполнить «первый» запрос Linq для строго типизированного объекта DataTable? - PullRequest
0 голосов
/ 14 октября 2010

Я пытаюсь выполнить простой запрос Linq «сначала найти» для типизированной DataTable, но не могу получить правильный синтаксис.

(Если я не использую таблицу типизированных данных/ строки объектов, все работает просто отлично.)

У меня есть это ...

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» или я могу написать метод «First» для класса MyDataTable?

Или мне нужно сделать что-то неуклюжее, например приведение MyDataTable, как DataTable и обработатьстроки как объекты DataRow?

Спасибо,

Ответы [ 3 ]

2 голосов
/ 14 октября 2010

Используйте Cast , чтобы преобразовать IEnumerable в строго типизированный IEnumerable<T>.

0 голосов
/ 14 октября 2010

Вместо написания собственной реализации AsEnumerable( ) вы можете ссылаться на сборку System.Data.DataSetExtensions

Тогда вы можете сделать:

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

Вам нужны следующие using операторы:

using System.Data.Linq;
using System.Linq;
0 голосов
/ 14 октября 2010

Прежде всего, ваш код работает здесь. row1 не является нулевым.

Если вы хотите проверить, существует ли запись, используйте метод Linq Any (r => r.One == 1).

...