从LINQ的SQL语法转换为内联

时间:2014-08-14 10:38:22

标签: c# linq datatable

首先 - 请有人建议一个更好的名称来区分内联语法和不那么多内联语法(即SQL-ish one)。 :)

我认为它们是完全可以互换的,而另一个则是一个语法糖。但是,我得到这个编译好了:

IEnumerable<DataRow> rows =
  from DataRow row in table.Rows
  select row;

,而

IEnumerable<DataRow> a = table.Rows.Select(...);

没有。我也尝试重新制作它,但那里没有 AsEnumerable(),也没有拿着行的表。我错过了什么?!         选择行;

我也注意到虽然行上有 AsQueryable(),但我仍然无法使用任何内联 LINQ魔法。没有选择(...)例如......

3 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

IEnumerable<DataRow> a = table.Rows.Cast<DataRow>().Select(x=>x);

答案 1 :(得分:1)

是的,AsEnumerable存在,不是Rows而是Table

var rows = table.AsEnumerable();

答案 2 :(得分:1)

问题是DataRowCollection(.Rows的类型)只实现IEnumerable 而不是IEnumerable<T>。因此,以下语法仅适用于DataRow一词,在这里您实际上是从对象转换为DataRow

IEnumerable<DataRow> rows =
from DataRow row in table.Rows
select row;

如果删除DataRow一词,它将不再有效:

IEnumerable<DataRow> rows =
from row in table.Rows
select row;

这与以下内容相同:

IEnumerable<DataRow> a = table.Rows.Select(x => x);

所以你必须从对象转换到DataRow才能从IEnumerable转到IEnumerable<DataRow>所以你可以这样做:

IEnumerable<DataRow> a = table.Rows.Cast<DataRow>();

或者你可以在DataTable上使用AsEnumerable扩展方法,它在幕后做了类似的事情:

IEnumerable<DataRow> a = table.AsEnumerable();