subsonic - преобразовать запрос linq в запрос sql / DataReader - PullRequest
1 голос
/ 14 декабря 2010

Допустим, у меня есть следующий запрос:

int x = 5;
var result = from p in db.products
             where p.CategoryId == x
             select p;

int count = result.Count();
List<product> products = result.ToList();

Это то, что у меня сейчас.Но, кроме того, мне нужен DataReader из результата:

// that's what I need:
var reader = ConvertSubSonicLinqQueryToDataReader(result);

Как я могу преобразовать оператор linq во что-то, с чем я могу работать?DataReader, DbCommand или даже простой sql со списком параметров.

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

Есть предложения?

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

Преобразование запроса LINQ - неправильный подход.LINQ возвращает результаты на уровне абстракции выше, чем работает DataReader.

Существует также проблема отложенного выполнения, так что ваш запрос LINQ в любом случае не может быть выполнен как один оператор SQL.

Raterчем использовать оператор LINQ, почему бы просто не использовать вместо него SqlQuery?

var qry = new Select().From(Product.Schema).Where(Product.CategoryIdColumn).IsEqualTo(x);

return qry.ExecuteReader();

Edit:
Только что вы видели, что вы используете SubSonic3 (а не 2, как приведенный выше кодбыть за), но потенциальное неправильное использование LINQ и дублирование работы все еще остается.

0 голосов
/ 29 декабря 2010

Код, который создает объект из DataReader, можно найти в DbDataProvider.ToEnumerable. Он вызывается из метода Execute DbQueryProvider (строка 227). Лучший способ «понять» магию LINQ - это установить точки останова на методы DbQueryProvider.

...