LINQ选择第一行

18

如何在LINQ查询语句中选择第一行而不使用foreach?

我使用foreach然后用break;退出循环,但肯定有更好的方法吧?

我想获取第一行的值,并检查是否没有找到任何行。我的问题是如何在不使用foreach语句的情况下获取该值。

我要做的是在我的DataTable中查找一个值,并且我知道这个行是唯一的;所以我想进行选择并获取该值;并确保如果没有匹配时进行检查... :)

这是我现在使用的代码,请参见下面

谢谢, Rune

var var_QUERY_linq = 
    from vm_TABLE_PK in vco_DataTable_PK.AsEnumerable()
    where vm_TABLE_PK.Field<Int32>( "MyField_Int32" ) == vmp_ROW_Counter_Int32
    select vm_TABLE_PK;

foreach ( DataRow o_DataRow in var_QUERY_linq )
{
       vmp_Return_string = o_DataRow.Field<string>( "Myfield_nvarchar" );

       break;
}
4个回答

43

只需使用 .FirstOrDefault() 方法即可。

var var_QUERY_linq = (
    from vm_TABLE_PK in vco_DataTable_PK.AsEnumerable()
    where vm_TABLE_PK.Field<Int32>( "MyField_Int32" ) == vmp_ROW_Counter_Int32
    select vm_TABLE_PK).FirstOrDefault();

if(var_QUERY_linq != null)
{
    //There is a record
}

只要你使用FirstOrDefault,我不相信空值检查会有任何问题。我认为你想要的是.First()。 - Corey Sunwold
11
当没有返回值时,First() 抛出异常,而 FirstOrDefault() 返回 null(在我所见到的所有情况下都是如此)。 - David Hall
3
@David Hall 是正确的。如果您期望始终会有一个或多个记录,则使用 .First(),这样如果没有记录,就会引发异常。如果您预计可能没有记录,则使用 .FirstOrDefault(),检查是否为 null 并适当处理。 - Michael La Voie
除了使用FirstOrDefault(),您还可以使用DefaultIfEmpty(); 否则,如David所说,它会抛出异常,导致您的应用程序停止工作。 - Tarik
谢谢! 但是我需要添加using System.Linq;才能使FirstOrDefault起作用...奇怪...我的其他linq没有问题...非常感谢! - RBC

4

当我使用FirstOrDefault从列表中查找第一个项目时,我遇到了项目的顺序(OrderBy)问题。

我建议您使用TAKE获取第一个项目:

var_QUERY_linq.Take(1).FirstOrDefault()

如果可能的话,始终使用SQL Profiler来检查发送到SQL服务器的查询。


4

.First()将只获取第一个元素,而.Single()将获取第一个元素并在存在更多元素的情况下引发异常


1

我假设MyField是您想要获取值的字段

var result = vm_Table_Pk.DefaultIfEmpty().First().MyField;

你还可以设置除了 NULL 以外的默认结果。例如:

var result = vm_Table_Pk.DefaultIfEmpty("Missing").First().MyField;

不用担心,Intellisense会帮助你完成这个过程。


太好了! 如何在不使用foreach的情况下获取我的值:vmp_Return_string = o_DataRow.Field<string>("Myfield_nvarchar"); - RBC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接