Неоднозначное сопоставление LINQ to SQL - PullRequest
0 голосов
/ 21 июля 2010

Я изучаю способ сопоставления LINQ с SQL, и у меня возникают некоторые проблемы с получением простой вещи.

Существует таблица sessions, которая содержит одну строку на имя пользователя.Рассмотрим следующий SQL


SELECT COUNT(*) AS c
FROM sessions
GROUP BY sessions.user_id
ORDER BY c DESC

Я использую LINQPad для тестирования преобразований LINQ-to-SQL.

Прямолинейный


    from s in Sessions group s by s.User_id into logins 
    orderby logins.Count() descending
    select new { c = logins.Count() }

дает мне


SELECT [t1].[value2] AS [c]
FROM (
    SELECT COUNT(*) AS [value], COUNT(*) AS [value2]
    FROM [sessions] AS [t0]
    GROUP BY [t0].[user_id]
    ) AS [t1]
ORDER BY [t1].[value] DESC

Модифицированный


    (from s in Sessions group s by s.User_id into logins 
    select new { c = logins.Count() }).OrderByDescending(v => v.c)

сопоставляется с


SELECT [t1].[value2] AS [c]
FROM (
    SELECT COUNT(*) AS [value], COUNT(*) AS [value2]
    FROM [sessions] AS [t0]
    GROUP BY [t0].[user_id]
    ) AS [t1]
ORDER BY [t1].[value] DESC

Я просто не могу получить этот оптимальный вывод.Есть ли способ?
Или, может быть, мне не стоит беспокоиться, так как SQL все равно будет оптимизирован?

Ответы [ 2 ]

0 голосов
/ 21 июля 2010

Или, может быть, мне не стоит беспокоиться, так как SQL все равно будет оптимизирован?

Сравните планы выполнения "оптимального" sql и сгенерированного sql. (Sql Studio - нажмите «Показать примерный план выполнения»)


Судя по моим годам нажатия на эту кнопку, и созданный подзапрос не представляет никакой проблемы.

Даже этот запрос должен быть в порядке (имеется в виду: без дополнительных затрат)

SELECT [t1].[value2] AS [c] 
FROM ( 
    SELECT COUNT(*) AS [value], COUNT(*) AS [value2] 
    FROM [sessions] AS [t0] 
    GROUP BY [t0].[user_id] 
    ) AS [t1] 
ORDER BY [t1].[value] DESC 
0 голосов
/ 21 июля 2010

В этом запросе "ничего" не так, он не будет дважды УЧЕТАТЬ строки, если вас это беспокоит.

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