我试图在数据表对象上执行LINQ查询,奇怪的是,我发现在数据表上执行这样的查询并不简单。例如:

var results = from myRow in myDataTable
where results.Field("RowNo") == 1
select results;

这是不允许的。我怎么才能让这样的东西工作呢?

我很惊讶,LINQ查询不允许在数据表上!


当前回答

var results = from myRow in myDataTable
where results.Field<Int32>("RowNo") == 1
select results;

其他回答

VB。代码如下所示:

Dim results = From myRow In myDataTable  
Where myRow.Field(Of Int32)("RowNo") = 1 Select myRow

我知道这个问题已经被回答过很多次了,但我只想提供另一种方法:

我喜欢使用.Cast<T>()方法,它可以帮助我在看到定义的显式类型时保持理智,并且我认为.AsEnumerable()无论如何都会调用它:

var results = from myRow in myDataTable.Rows.Cast<DataRow>() 
                  where myRow.Field<int>("RowNo") == 1 select myRow;

or

var results = myDataTable.Rows.Cast<DataRow>()
                  .FirstOrDefault(x => x.Field<int>("RowNo") == 1);

如注释中所述,不需要System.Data.DataSetExtensions或任何其他程序集(参考)

这是一个简单的方法,适用于我和使用lambda表达式:

var results = myDataTable.Select("").FirstOrDefault(x => (int)x["RowNo"] == 1)

然后如果你想要一个特定的值:

if(results != null) 
    var foo = results["ColName"].ToString()

试试这个简单的问题:

var result=myDataTable.AsEnumerable().Where(myRow => myRow.Field<int>("RowNo") == 1);

您可以尝试这样做,但必须确定每个Column的值类型

List<MyClass> result = myDataTable.AsEnumerable().Select(x=> new MyClass(){
     Property1 = (string)x.Field<string>("ColumnName1"),
     Property2 = (int)x.Field<int>("ColumnName2"),
     Property3 = (bool)x.Field<bool>("ColumnName3"),    
});