为什么myDataTable.AsEnumerable()。DefaultIfEmpty(myDataTable.NewRow())。首先(...)当.First(...)为空时,不返回myDataTable.NewRow()?

时间:2015-03-09 02:50:42

标签: c# linq datatable

我试图得到一个数据表的第一行,它的主键值等于我为这个LINQ查询提供的值,或者是该表中的一个新行。

我已经尝试了

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

但它会抛出一个InvalidOperationException,告诉我&#39;序列中没有匹配的元素&#39;。

我尝试了与

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

因为我认为这将返回我在DefaultIfEmpty(...)中指定的值,但它只返回null。

那么......我在这里做错了什么?有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:2)

我想你的查询应该是:

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

DefaultIfEmpty()为您提供的所有内容都是一个项目,可以查询该集合是否为空。问题是通过使用First(),必须找到满足条件的行。显然你并没有抛出异常。