Почему IEnumerable.Count () ограничен 200? - PullRequest
2 голосов
/ 16 января 2009

Есть ли предел для строк, которые IEnumerable.Count () (или IQueryable.Count ()) использует LINQ to SQL? По какой-то причине, если мой запрос возвращает более 200 записей, я получаю только 200 из IEnumerable.Count (). Я даже пытался использовать IEnumerable.LongCount () (хотя количество результатов не должно быть достаточно большим, чтобы это понадобилось). Я также подтвердил, что вызов COUNT для базы данных возвращает более 200 записей.

Я проверил MSDN и попытался найти его, но безрезультатно.

Я схожу с ума, или я чего-то упускаю? Я полагаю, это не имеет большого значения (поскольку программа вставляет нужное количество записей), но было бы неплохо иметь возможность регистрировать количество переданных записей.

Можем ли мы увидеть пример кода?

public IEnumerable<Irms_tx_modify_profile_ban> ExtractNewAdmits()
    {
        var results = from a in _dc.Applications
                      select (Irms_tx_modify_profile_ban)new RMSProfile
                      {
                          //assign column names to property names
                      };

        //Don't know why, but Bad Things happen if you don't put the
        //OfType call here.
        IEnumerable<Irms_tx_modify_profile_ban> narrowed_results = results.OfType<Irms_tx_modify_profile_ban>();
        Program.log.InfoFormat("Read {0} records from Banner.", narrowed_results.Count());
        return narrowed_results;
      }

Причиной комментариев о происходящих плохих вещах являются проблемы, поднятые в этой теме . Что я только что узнал, так это то, что если я вызываю Count для функции smalled_results (IEnumerable), он возвращает правильную сумму. Если я назову его результатами (IQueryable), он вернет только 200. Я пойду дальше и решу ответ Скита (поскольку он упомянул разницу между IQueryable и IEnumerable), но если кто-нибудь сможет объяснить, почему это происходит, я ' Я хотел бы услышать это.

1 Ответ

3 голосов
/ 16 января 2009

Я не слышал ничего подобного, и это звучит очень странно.

Наиболее очевидная вещь для проверки - какой запрос отправляется в базу данных. Кроме того, очень важно, звоните ли вы по номеру Enumerable.Count() (т.е. на IEnumerable<T>) или Queryable.Count() (т.е. на IQueryable<T>). Первый будет выполнять итерацию по фактическим строкам в коде .NET для получения счетчика; последний поместит счет в запрос.

Можем ли мы увидеть пример кода?

РЕДАКТИРОВАТЬ: Хорошо, так увидев код:

  • Когда вы не вызывали OfType, он выполнял подсчет на уровне SQL. Это должно было быть видно в журнале SQL и воспроизводиться любым другим инструментом SQL.

  • Я подозреваю, что у вас на самом деле не было для вызова OfType. Вы могли бы вызвать AsEnumerable или просто объявить results как IEnumerable<Irms_tx_modify_profile_ban>. Важно то, что тип переменной решает, какой метод расширения использовать, и, следовательно, где выполняется счет.

Стоит отметить, что ваше текущее решение действительно неэффективно - оно извлекает все данные и подсчитывает их, но игнорирует все, кроме подсчета. Было бы намного лучше получить подсчет на стороне сервера - и хотя я знаю, что в данный момент это не работает, я уверен, с небольшим анализом мы сможем заставить его работать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...