我正在尝试在类型化的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对象的事情?
谢谢,
答案 0 :(得分:2)
使用Cast将IEnumerable
转换为强类型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;