LINQ - различные результаты с LINQ to SQL против LINQPad - PullRequest
2 голосов
/ 03 мая 2011

Я выполняю «тот же» запрос, используя LINQ to SQL и в LINQPad, однако набор результатов получается немного по-другому.

Код

var conn = new SqliteConnection (
            "DbLinqProvider=Sqlite;" + 
            "Data Source=/home/larsenma/database.golden"
        );

Models.Main db = new Models.Main (conn);

var runSum =
  from rr in db.Runrecords
  group rr by rr.RunID into rg          
  select new 
  {
    LaneCount = rg.Count(),
  }

LINQPad правильно вычисляет «LaneCount», тогда как с LINQ to SQL я получаю 1 с для каждой записи.

В LINQ to SQL я использовал sqlmetal для генерации своего отображения для DBLinq, а в LINQPad - драйвер IQ. Моя база данных - SQLite.

Я довольно новичок в этом материале LINQ, есть идеи, где я ошибаюсь?

редактирует

Я упростил мой запрос до минималистского воспроизводимого экземпляра. Когда я отлаживаю сгенерированный SQL, я получаю

SELECT (SELECT COUNT(*))
FROM runrecords
GROUP BY RunID

Это второй "СЧЕТ (*)", который пропускает вещи.

Спасибо.

1 Ответ

5 голосов
/ 04 мая 2011

Похоже, вы используете DBLinq, а не LINQ to SQL.Инструмент sqlmetal генерирует классы сущностей и типизированный DataContext - однако, если вы используете DBLinq, то это DBLinq, который фактически переводит LINQ в SQL.

Когда я последний раз смотрел на DBLinq (год или два назад), это былодовольно примитивен и упал даже на некоторые базовые запросы.Драйвер IQ LINQPad использует IQueryable инструментарий Мэтта Уоррена , который, вероятно, является наиболее сложным независимым от поставщика механизмом для перевода LINQ в SQL.Другим хорошим движком является библиотека LINQ Connect от DevArt - в последнее время она прошла долгий путь и также поддерживает SQLite.

Сейчас я нахожусь в процессе обновления драйвера IQ для поддержки Oracle, а также планируюопубликовать некоторые улучшения в самой библиотеке IQueryable.Почему бы вам не попробовать использовать эту библиотеку или библиотеку DevArt.

...