LINQ — разные результаты с LINQ to SQL и LINQPad

Я выполняю «тот же» запрос, используя 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

Это второй «COUNT (*)», который пропускает вещи.

Спасибо.


person Mark    schedule 03.05.2011    source источник


Ответы (1)


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

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

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

person Joe Albahari    schedule 04.05.2011
comment
Спасибо, Джо. Ты прав. Я не понимал, что реализация LINQ to SQL, включенная в моно, - это DBLinq. Надо было упомянуть об этом в моем вопросе. - person Mark; 04.05.2011
comment
Инструментарий IQueryable имеет открытый исходный код, поэтому вы можете успешно скомпилировать его в Mono. Дайте мне знать, как вы поживаете. - person Joe Albahari; 04.05.2011