为什么 myDataTable.AsEnumerable().DefaultIfEmpty(myDataTable.NewRow()).First(...) NOT return myDataTable.NewRow() 当 .First(...) 为空时?

Why does myDataTable.AsEnumerable().DefaultIfEmpty(myDataTable.NewRow()).First(...) NOT return myDataTable.NewRow() when .First(...) is empty?

我正在尝试获取主键值等于我提供给此 LINQ 查询的值的数据 table 的第一行,或者从 table.

我试过了

DataRow Foo = myDataTable.AsEnumerable().DefaultIfEmpty(myDataTable.NewRow()).First(Row => Row.Field<string>("KEY").equals("Bar"))

但它抛出 InvalidOperationException,告诉我 'Sequence contains no matching element'。

我尝试过与

类似的东西
DataRow Foo = myDataTable.AsEnumerable().DefaultIfEmpty(myDataTable.NewRow()).FirstOrDefault(Row => Row.Field<string>("KEY").equals("Bar"))

因为我认为那会 return 我在 DefaultIfEmpty(...) 中指定的值,但它只会 return 为 null。

所以...我在这里做错了什么?有办法实现吗?

我想你的查询应该是:

var key = "Bar";
var foo = myDataTable.AsEnumerable()
    .FirstOrDefault(row => row.Field<string>("KEY") == key) ?? myDataTable.NewRow();

DefaultIfEmpty() 为您提供的只是一个项目,用于在集合为空时进行查询。问题是通过使用 First(),必须找到满足条件 的行 。显然你没有,所以抛出异常。