LINQ SELECT FIRST ROW
Как выбрать первую строку в инструкции выбора linq без использования foreach?
Я использую foreach, а затем break;, но это должен быть лучший способ?
Мне нравится получать значение в первой строке; плюс проверьте, не найден ли строка.
Моя проблема - получить значение без инструкции foreach.
Что я делаю, это найти значение в моем DataTable, и я знаю, что строка uniqe; поэтому мне нравится делать выбор и получать значение; плюс сделать проверку, если нет хита, чтобы быть в безопасности...:)
Это код, который я использую сейчас, см. ниже
Спасибо,
Руна
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;
}
Ответы
Ответ 1
Просто используйте .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
}
Ответ 2
.First() будет принимать только первое или .Single() будет принимать первое и возбуждать исключение, если есть больше
Ответ 3
У меня возникла проблема с порядком элемента (OrderBy), когда я использую FirstOrDefault для поиска первого элемента из списка.
Я бы предложил вам использовать TAKE для получения первого элемента:
var_QUERY_linq.Take(1).FirstOrDefault()
* Всегда используйте sql-профайлер, если это возможно, чтобы проверить запрос, отправленный на SQL-сервер.
Ответ 4
Я предполагаю, что MyField - это поле, которое вы хотите получить значение
var result = vm_Table_Pk.DefaultIfEmpty().First().MyField;
Вы также можете установить результат по умолчанию, отличный от NULL. Например:
var result = vm_Table_Pk.DefaultIfEmpty("Missing").First().MyField;
И не беспокойтесь, Intellisense поможет вам таким образом.