Я пытаюсь выполнить простой запрос 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?
Спасибо,