Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 LINQ - проще  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7063
Сегодня осознал, что EF проще. Вот такой LINQ

+
            var vhcChkLists = await _db.TblVehicleCheckListDetails
                .GroupBy(p => p.AssignedVehicleCheckList)
                .Select(p => new
                {
                    AnsweredQuestion = p.Where(c => c.Answer != null).Count(),
                    NoQuestion = p.Where(c => c.Answer == 2).Count(),
                    TotalQuestion = p.Count(),
                    p.Key.ASSTCode,
                    p.Key.CheckDate,
                    p.Key.CreatedBy,
                    p.Key.Id,
                    p.Key.OdometerReading,
                    p.Key.TruckUnit,
                    p.Key.Comments,
                    p.Key.PCCode
                })
                .OrderByDescending(p => p.Id)
                .ToListAsync();

нарисовал такой sql и секономил мне несколколько седых волос на попе.
+
SELECT 
    [Project2].[Id] AS [Id], 
    [Project2].[C2] AS [C1], 
    [Project2].[C3] AS [C2], 
    [Project2].[C1] AS [C3], 
    [Project2].[ASSTCode] AS [ASSTCode], 
    [Project2].[CheckDate] AS [CheckDate], 
    [Project2].[CreatedBy] AS [CreatedBy], 
    [Project2].[OdometerReading] AS [OdometerReading], 
    [Project2].[TruckUnit] AS [TruckUnit], 
    [Project2].[Comments] AS [Comments], 
    [Project2].[PCCode] AS [PCCode]
    FROM ( SELECT 
        [Project1].[C1] AS [C1], 
        [Project1].[Id] AS [Id], 
        [Project1].[CheckDate] AS [CheckDate], 
        [Project1].[TruckUnit] AS [TruckUnit], 
        [Project1].[PCCode] AS [PCCode], 
        [Project1].[OdometerReading] AS [OdometerReading], 
        [Project1].[ASSTCode] AS [ASSTCode], 
        [Project1].[CreatedBy] AS [CreatedBy], 
        [Project1].[Comments] AS [Comments], 
        [Project1].[C2] AS [C2], 
        (SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[TblVehicleCheckListDetails] AS [Extent4]
            WHERE (([Project1].[Id] = [Extent4].[AssignedVehicleCheckListId]) OR (1 = 0)) AND (2 = [Extent4].[Answer])) AS [C3]
        FROM ( SELECT 
            [GroupBy1].[A1] AS [C1], 
            [GroupBy1].[K1] AS [Id], 
            [GroupBy1].[K2] AS [CheckDate], 
            [GroupBy1].[K3] AS [TruckUnit], 
            [GroupBy1].[K4] AS [PCCode], 
            [GroupBy1].[K6] AS [OdometerReading], 
            [GroupBy1].[K7] AS [ASSTCode], 
            [GroupBy1].[K8] AS [CreatedBy], 
            [GroupBy1].[K10] AS [Comments], 
            (SELECT 
                COUNT(1) AS [A1]
                FROM [dbo].[TblVehicleCheckListDetails] AS [Extent3]
                WHERE (([GroupBy1].[K1] = [Extent3].[AssignedVehicleCheckListId]) OR (1 = 0)) AND ([Extent3].[Answer] IS NOT NULL)) AS [C2]
            FROM ( SELECT 
                [Extent2].[Id] AS [K1], 
                [Extent2].[CheckDate] AS [K2], 
                [Extent2].[TruckUnit] AS [K3], 
                [Extent2].[PCCode] AS [K4], 
                [Extent2].[CheckedBy] AS [K5], 
                [Extent2].[OdometerReading] AS [K6], 
                [Extent2].[ASSTCode] AS [K7], 
                [Extent2].[CreatedBy] AS [K8], 
                [Extent2].[CreatedOn] AS [K9], 
                [Extent2].[Comments] AS [K10], 
                COUNT(1) AS [A1]
                FROM  [dbo].[TblVehicleCheckListDetails] AS [Extent1]
                INNER JOIN [dbo].[TblVehicleCheckLists] AS [Extent2] ON [Extent1].[AssignedVehicleCheckListId] = [Extent2].[Id]
                GROUP BY [Extent2].[Id], [Extent2].[CheckDate], [Extent2].[TruckUnit], [Extent2].[PCCode], [Extent2].[CheckedBy], [Extent2].[OdometerReading], [Extent2].[ASSTCode], [Extent2].[CreatedBy], [Extent2].[CreatedOn], [Extent2].[Comments]
            )  AS [GroupBy1]
        )  AS [Project1]
    )  AS [Project2]
    ORDER BY [Project2].[Id] DESC
12 дек 18, 23:13    [21762234]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7063
Не обошлось и без магии компиляйтора

OR (1 = 0)
12 дек 18, 23:22    [21762242]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26611
На SQL это в строк двадцать можно выразить и без подзапросов.
Выполняться будет на порядок быстрее.
13 дек 18, 08:07    [21762368]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26611
Relic Hunter,

колонка Comments случаем не NVARCHAR (MAX)?
13 дек 18, 08:11    [21762369]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
PinkCat
Member [заблокирован]

Откуда:
Сообщений: 2541
skyANA,

На SQL это в строк двадцать можно выразить и без подзапросов.
-----
И выполнятся оно будет и на мелкомягком, и на оркале, и на постгрее...
И будет работать даже когда типы поменяются...
13 дек 18, 12:19    [21762754]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
hVostt
Member

Откуда:
Сообщений: 15815
skyANA
На SQL это в строк двадцать можно выразить и без подзапросов.
Выполняться будет на порядок быстрее.


Конечно на порядок быстрее не будет.

Быстрее будет только если написать совсем _другой_ запрос.
А не тот же самый, но по-другому.

И конечно надо правильно писать и читать LINQ, чтобы понимать, какой запрос на это сгенерируется.
13 дек 18, 15:38    [21763123]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26611
hVostt
Быстрее будет только если написать совсем _другой_ запрос.
А не тот же самый, но по-другому.

Что значит тот же самый? Возвращающий аналогичный результат?

К примеру запрос со вложенными SELECT COUNT вернёт тоже самое, что и SELECT SUM(CASE, но при этом последний будет в разы короче и быстрее.
Оконными функциями также можно всё короче и быстрее оформить.
13 дек 18, 16:36    [21763208]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
hVostt
Member

Откуда:
Сообщений: 15815
skyANA
Что значит тот же самый? Возвращающий аналогичный результат?


да, аналогичный результат при тех же вводных

skyANA
К примеру запрос со вложенными SELECT COUNT вернёт тоже самое, что и SELECT SUM(CASE, но при этом последний будет в разы короче и быстрее.
Оконными функциями также можно всё короче и быстрее оформить.


это предположение?
наши опыты и тесты показывают, что оптимизатор БД в состоянии "страшный" запрос, генерируемый EF, выполнить также быстро, как SQL, написанный вручную.

обычно это верно для 90% запросов.

бывает, что EF генерит какую-то дичь, но это для сложных случаев, которые даже LINQ без пол бутылки не разобрать.
14 дек 18, 11:19    [21763808]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
Dima T
Member

Откуда:
Сообщений: 13920
hVostt
наши опыты и тесты показывают, что оптимизатор БД в состоянии "страшный" запрос, генерируемый EF, выполнить также быстро, как SQL, написанный вручную.

обычно это верно для 90% запросов.

ИМХО Это запросы переводящиеся в SQL сменой синтаксиса. LINQ близок к SQL по синтаксису. Оставшиеся 10% - это то что один-в-один в select не трасформируется.

Оптимизатор БД не переоценивай. В MS SQL он продвинутый, но не сильно. На сложных запросах может выбирать очень неоптимальные планы выполнения.

PS Идеология "CodeFirst наше всё" ведет к тому что проблему оставшихся 10% решать будет некому. Данный топик пример этого.
14 дек 18, 17:34    [21764270]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1996
>hVostt, вчера, 11:19 [21763808]
>наши опыты и тесты показывают...также быстро, как SQL, написанный вручную...обычно это верно для 90% запросов.
<давайте проверим на данном конкретном примере.
15 дек 18, 00:04    [21764560]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
ВМоисеев,
Хотите вернутся к срачу linq или ОРМ?
Поезд ушел.
15 дек 18, 09:06    [21764638]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
ВМоисеев,
Не так)
Linq (ORM) или SQL.
15 дек 18, 09:07    [21764639]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26611
hVostt
skyANA
К примеру запрос со вложенными SELECT COUNT вернёт тоже самое, что и SELECT SUM(CASE, но при этом последний будет в разы короче и быстрее.
Оконными функциями также можно всё короче и быстрее оформить.


это предположение?

Это опыт.

Раз в год приходят ко мне с просьбой помочь ускорить запрос.
15 дек 18, 10:22    [21764654]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26611
hVostt
обычно это верно для 90% запросов.

С этим не спорю. Речь конкретно про запрос в начале топика.
15 дек 18, 10:25    [21764655]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26611
ВМоисеев
>hVostt, вчера, 11:19 [21763808]
>наши опыты и тесты показывают...также быстро, как SQL, написанный вручную...обычно это верно для 90% запросов.
<давайте проверим на данном конкретном примере.

Бекап базы у автора топика попросим что-ли? Картинка с другого сайта.
15 дек 18, 10:26    [21764657]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
love_bach
Member

Откуда:
Сообщений: 515
hVostt
skyANA
На SQL это в строк двадцать можно выразить и без подзапросов.
Выполняться будет на порядок быстрее.


Конечно на порядок быстрее не будет.

Быстрее будет только если написать совсем _другой_ запрос.
А не тот же самый, но по-другому.

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


почему я тебя понял, а skyANA начал задавать "уточняющие" вопросы?
15 дек 18, 10:46    [21764669]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
love_bach
Member

Откуда:
Сообщений: 515
Petro123
ВМоисеев,
Не так)
Linq (ORM) или SQL.


это вечный срач
15 дек 18, 10:48    [21764670]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
love_bach
Member

Откуда:
Сообщений: 515
skyANA
ВМоисеев
>hVostt, вчера, 11:19 [21763808]
>наши опыты и тесты показывают...также быстро, как SQL, написанный вручную...обычно это верно для 90% запросов.
<давайте проверим на данном конкретном примере.

Бекап базы у автора топика попросим что-ли? Картинка с другого сайта.


будешь оптимизировать его запросы? тебе делать нечего, всего достиг?
15 дек 18, 10:49    [21764671]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
love_bach
Petro123
ВМоисеев,
Не так)
Linq (ORM) или SQL.


это вечный срач
)))
В Java года три уже как прошёл))
15 дек 18, 11:28    [21764690]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1996
>skyANA, сегодня, 10:26 [21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
15 дек 18, 12:31    [21764725]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1996
>skyANA, сегодня, 10:26 [21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
15 дек 18, 12:32    [21764729]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1996
>skyANA, сегодня, 10:26 [21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
15 дек 18, 12:36    [21764732]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 2029
ВМоисеев
>skyANA, сегодня, 10:26 [21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.

А я думал Вы сами хотите проверить.
15 дек 18, 12:38    [21764735]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 2029
ВМоисеев,

автор топика не удосужился ответить на вопрос о типа колонки Comments, ему походу топик совсем не интересен
15 дек 18, 12:39    [21764737]     Ответить | Цитировать Сообщить модератору
 Re: LINQ - проще  [new]
love_bach
Member

Откуда:
Сообщений: 515
Дмитрий Мух
ВМоисеев,

автор топика не удосужился ответить на вопрос о типа колонки Comments, ему походу топик совсем не интересен


ну, допустим, varchar(MAX). возможно, извлекает только по Id. возможно в какой-то журнал извлекает записи, где это поле только первые надцать символов. что дальше?
15 дек 18, 13:00    [21764750]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить