如何在不使用foreach的情况下选择linq select语句中的第一行?
我使用foreach然后休息;但它必须是更好的方式吗?
我喜欢在第一行获得价值;加上检查是否找不到行。 我的问题是在没有foreach声明的情况下获得价值。
我所做的是在我的DataTable中找到一个值,我知道该行是独一无二的;所以我喜欢做一个选择并获得价值;加上检查是否没有安全命中......:)
这是我现在使用的代码,见下文
谢谢你, 符文
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;
}
答案 0 :(得分:39)
只需使用.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
}
答案 1 :(得分:4)
.First()将只接受第一个或.Single()将接受第一个并且如果有更多则引发异常
答案 2 :(得分:3)
当我使用FirstOrDefault查找列表中的第一个项目时,我解决了项目(OrderBy)的顺序问题。
我建议您使用TAKE来获取第一项:
var_QUERY_linq.Take(1).FirstOrDefault()
*如果可能,请始终使用sql profiler检查发送到SQL Server的查询。
答案 3 :(得分:0)
我认为MyField是你想要获得
值的字段var result = vm_Table_Pk.DefaultIfEmpty().First().MyField;
您还可以设置除NULL之外的默认结果。喜欢:
var result = vm_Table_Pk.DefaultIfEmpty("Missing").First().MyField;
不要担心Intellisense会帮助你这样做。