Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2012, 13:17   #1
Гаврилов
Пользователь
 
Регистрация: 11.05.2012
Сообщений: 85
По умолчанию Как узнать количество полученных записей в результате запроса LINQ to DataSet?

Добрый день!
Я не привожу конкретный запрос, потому что у меня проблема общая для всех LINQ-селектов: как узнать количество отселектированных строк такого запроса? В частности, сегодня опять эта проблема возникла при необходимости сделать подзапрос к полученной из БД DataTable - не делать же ещё один почти такой же запрос непосредственно к удалённой БД! Это было бы не слишком грамотно.
Конечно, можно прокрутить результат в цикле foreach. Есть ещё вариант: использовать цикл try-catch, т.к. LINQ в случае отсутствия записей выдаёт System.Exception (кстати, как тогда понять, что это отсутствие записей, а не какая-то другая ошибка?).
Но существует ли менее дебильный способ узнать количество полученных записей?
Спасибо за внимание.
Гаврилов вне форума Ответить с цитированием
Старый 03.09.2012, 13:51   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А у переменки, которая формируется от LINQ нет свойства length() ?
Или GetLEngth(Номер уровня)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.09.2012, 14:28   #3
Гаврилов
Пользователь
 
Регистрация: 11.05.2012
Сообщений: 85
По умолчанию

В некоторых случаях действительно можно применить Count(). Правда, он в подсказке VC 2010 выглядит как типизированный: Count<>. Но я имею в виду случаи, когда на выходе не массив, а запросы, подобные следующему (здесь dsTable - источник данных типа DataTable):
Код:
DataRow record = null;

try
{
  // (может быть выбрана одна запись или ни одной)
  record =
  ( from rec in dsTable.AsEnumerable()
    where rec.Field<int>("WARE_ID") == wareId 
    select rec
  ).First();
}
catch ( System.Exception ex )
{
  ... сообщение
  return;
}

// Всё делается ради update одного поля:
if ( record != null )
{
  record.SetField<string>("APP_FLAG", "-1");
  dsTable.AcceptChanges();
}
Здесь нет возможности применить ни Count, ни Length, ни GetLenght.
Это работает, пока количество записей != 0. А если в результате не выбрано ни одной записи, срабатывает Exception, что крайне прискорбно.

Последний раз редактировалось Stilet; 03.09.2012 в 15:39.
Гаврилов вне форума Ответить с цитированием
Старый 03.09.2012, 14:40   #4
Петррр
Форумчанин
 
Аватар для Петррр
 
Регистрация: 02.09.2011
Сообщений: 336
По умолчанию

Метод Count должен возвратить число, и исключение генерироваться не должно.
В Вашем же случае исключение генерируется потому что Вы из пустой последовательности пытаетесь извлечь первый элемент.

Код:
IEnumerable<DataRow> records = from rec in dsTable.AsEnumerable()
                                              where rec.Field<int>("WARE_ID") == wareId 
                                              select rec;

DataRow record = null;

if (records.Count() > 0)
    record = records.First();
Примерно так должно выглядеть. Код писал в браузере, поэтому не обессудь.
Если ты не можешь найти то, ради чего стоит жить, лучше найти то, за что стоит умереть
Петррр вне форума Ответить с цитированием
Старый 03.09.2012, 15:20   #5
Гаврилов
Пользователь
 
Регистрация: 11.05.2012
Сообщений: 85
По умолчанию

Все-таки используется коллекция, как и при запросах множества записей. Я так пробовал, но не додумался использовать records.First(), т.е. указывать единственность ожидаемой строки не в запросе, а после него.
Спасибо, Петррр! Я попробовал - работает.
Тогда позволю себе смежный вопрос:
Какие исключения могут вызывать запросы LINQ to DataSet, кроме сакраментального System.Exception? Где посмотреть? Я в инете пока нигде не нашёл.
Гаврилов вне форума Ответить с цитированием
Старый 03.09.2012, 16:21   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Цитата:
не в запросе, а после него.
Что у вас что у Петррр, одинаково.
FirstOrDefault юзайте, если нет уверенности в данных.
Цитата:
Какие исключения
У каждого метода есть список исключений.
eval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать нумерацию записей, полученных запросом Speeker БД в Delphi 3 30.11.2011 12:09
Как удалить переносы в результате запроса в Oracle Sparkman SQL, базы данных 1 08.10.2010 05:23
Как узнать что число не Float(без остатка) при результате деления? zotox Помощь студентам 7 19.07.2009 15:49
Рандомные помехи в результате запроса MySQL Ivan_32 SQL, базы данных 0 17.07.2009 05:52
Ошибка отображения данных в результате sql запроса в BDE Serjio77 БД в Delphi 9 31.05.2009 20:30