Есть ли реализация IQueryable поверх DbDataReader? - PullRequest
3 голосов
/ 25 июня 2009

У меня много существующего кода, который использует сырой ADO.NET (DbConnection, DbDataReader и т. Д.). Я хотел бы перейти к использованию LINQ to SQL для нового кода, но пока поместите существующий и новый код в единый набор классов репозитория.

У меня есть одна проблема: я хотел бы, чтобы классы репозитория представляли наборы результатов в виде IQueryable <>, который я получаю бесплатно с помощью LINQ to SQL. Как мне обернуть мои существующие наборы результатов DbDataReader в IQueryable? Нужно ли реализовывать IQueryable поверх DbDataReader с нуля?

Примечание. Мне известно о LINQ to DataSet, но я не использую DataSets из-за проблем с масштабированием памяти, поскольку наборы результатов, с которыми я имею дело, могут быть довольно большими (порядка 1000 с). Это означает, что реализация IQueryable поверх DbDataReader также должна быть эффективной (т.е. не кэшировать результаты в памяти).

1 Ответ

6 голосов
/ 25 июня 2009

Я не вижу никаких преимуществ в реализации IQueryable<T> - которая предполагает больше функциональности, чем на самом деле доступно - однако вы можете реализовать ее как IEnumerable<T> достаточно легко, с оговоркой, что это один раз. Блок итератора будет разумным выбором:

    public static IEnumerable<IDataRecord> AsEnumerable(
        this IDataReader reader)
    {
        while (reader.Read())
        {
            yield return reader; // a bit dangerous
        }
    }

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

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