2009-10-03 4 views
16

Как выбрать первую строку в инструкции выбора linq без использования foreach?LINQ SELECT FIRST ROW

Я использую foreach, а затем ломаю; но это должен быть лучший способ?

Мне нравится получать значение в первой строке; плюс проверьте, не найден ли строка. Моя проблема - получить значение без инструкции 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; 
} 

ответ

38

Просто используйте. 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 
} 
+0

Я не считаю, что проверка нулевой будет когда-нибудь оказаться что-либо до тех пор, как вы используете FirstOrDefault , Я верю, что вы хотите. Сначала(). –

+10

.First() выбрасывает и исключает, когда ничего не возвращается, а FirstOrDefault() возвращает значение null (в каждой ситуации, которую я видел. –

+3

@ David Hall - это правильно. Используйте .First(), если вы ожидаете, что всегда должно быть одно или больше записей, так что вы получите исключение, если это не произойдет. Если вы ожидаете возможности отсутствия записей, используйте .FirstOrDefault() и проверьте нуль и обрабатывайте соответственно. –

0

Я полагаю, MyField это поле вы хотите получить значение

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

Вы также можете установить результат по умолчанию, отличный от NULL. Нравится:

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

И не беспокойтесь, Intellisense поможет вам на этом пути.

+0

NICE! Как получить мою стоимость без foreach: vmp_Return_string = o_DataRow.Field ("Myfield_nvarchar"); – 2009-10-03 02:31:22

+0

@RBC, я изменил код в соответствии с вашим вопросом. – Tarik

3

У меня возникла проблема с порядком элемента (OrderBy), когда я использую FirstOrDefault, чтобы найти первый элемент из списка.

Я хотел бы предложить вам использовать TAKE, чтобы получить первый пункт:

var_QUERY_linq.Take(1).FirstOrDefault() 

* Всегда использовать SQL Profiler, если это возможно, чтобы проверить запрос, который отправляется на сервер SQL.

+0

NICE! Спасибо! – 2009-11-04 00:24:56

+0

Хороший ответ !!! Weldone How Lun – Amit

4

.Первый() будет принимать только первый или Одиночная() будет брать первый и поднять исключение, если есть больше