powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ - проще
25 сообщений из 58, страница 1 из 3
LINQ - проще
    #39747012
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня осознал, что EF проще. Вот такой LINQ

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
            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 и секономил мне несколколько седых волос на попе.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
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

...
Рейтинг: 0 / 0
LINQ - проще
    #39747015
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не обошлось и без магии компиляйтора

Код: sql
1.
OR (1 = 0)
...
Рейтинг: 0 / 0
LINQ - проще
    #39747073
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На SQL это в строк двадцать можно выразить и без подзапросов.
Выполняться будет на порядок быстрее.
...
Рейтинг: 0 / 0
LINQ - проще
    #39747074
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter,

колонка Comments случаем не NVARCHAR (MAX)?
...
Рейтинг: 0 / 0
LINQ - проще
    #39747289
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

На SQL это в строк двадцать можно выразить и без подзапросов.
-----
И выполнятся оно будет и на мелкомягком, и на оркале, и на постгрее...
И будет работать даже когда типы поменяются...
...
Рейтинг: 0 / 0
LINQ - проще
    #39747475
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAНа SQL это в строк двадцать можно выразить и без подзапросов.
Выполняться будет на порядок быстрее.

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

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

И конечно надо правильно писать и читать LINQ, чтобы понимать, какой запрос на это сгенерируется.
...
Рейтинг: 0 / 0
LINQ - проще
    #39747506
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttБыстрее будет только если написать совсем _другой_ запрос.
А не тот же самый, но по-другому.
Что значит тот же самый? Возвращающий аналогичный результат?

К примеру запрос со вложенными SELECT COUNT вернёт тоже самое, что и SELECT SUM(CASE, но при этом последний будет в разы короче и быстрее.
Оконными функциями также можно всё короче и быстрее оформить.
...
Рейтинг: 0 / 0
LINQ - проще
    #39747797
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЧто значит тот же самый? Возвращающий аналогичный результат?

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

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

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

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

бывает, что EF генерит какую-то дичь, но это для сложных случаев, которые даже LINQ без пол бутылки не разобрать.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748058
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttнаши опыты и тесты показывают, что оптимизатор БД в состоянии "страшный" запрос, генерируемый EF, выполнить также быстро, как SQL, написанный вручную.

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

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

PS Идеология "CodeFirst наше всё" ведет к тому что проблему оставшихся 10% решать будет некому. Данный топик пример этого.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748268
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, вчера, 11:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21763808][21763808]
>наши опыты и тесты показывают...также быстро, как SQL, написанный вручную...обычно это верно для 90% запросов.
<давайте проверим на данном конкретном примере.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748309
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,
Хотите вернутся к срачу linq или ОРМ?
Поезд ушел.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748310
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,
Не так)
Linq (ORM) или SQL.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748320
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAК примеру запрос со вложенными SELECT COUNT вернёт тоже самое, что и SELECT SUM(CASE, но при этом последний будет в разы короче и быстрее.
Оконными функциями также можно всё короче и быстрее оформить.

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

Раз в год приходят ко мне с просьбой помочь ускорить запрос.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748321
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttобычно это верно для 90% запросов.
С этим не спорю. Речь конкретно про запрос в начале топика.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748323
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>hVostt, вчера, 11:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21763808][21763808]
>наши опыты и тесты показывают...также быстро, как SQL, написанный вручную...обычно это верно для 90% запросов.
<давайте проверим на данном конкретном примере.
Бекап базы у автора топика попросим что-ли?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748329
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAНа SQL это в строк двадцать можно выразить и без подзапросов.
Выполняться будет на порядок быстрее.

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

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

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

почему я тебя понял, а skyANA начал задавать "уточняющие" вопросы?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748330
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ВМоисеев,
Не так)
Linq (ORM) или SQL.

это вечный срач
...
Рейтинг: 0 / 0
LINQ - проще
    #39748331
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВМоисеев>hVostt, вчера, 11:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21763808][21763808]
>наши опыты и тесты показывают...также быстро, как SQL, написанный вручную...обычно это верно для 90% запросов.
<давайте проверим на данном конкретном примере.
Бекап базы у автора топика попросим что-ли?


будешь оптимизировать его запросы? тебе делать нечего, всего достиг?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748338
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachPetro123ВМоисеев,
Не так)
Linq (ORM) или SQL.

это вечный срач)))
В Java года три уже как прошёл))
...
Рейтинг: 0 / 0
LINQ - проще
    #39748349
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>skyANA, сегодня, 10:26 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21764657][21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748351
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>skyANA, сегодня, 10:26 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21764657][21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748352
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>skyANA, сегодня, 10:26 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21764657][21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748354
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>skyANA, сегодня, 10:26 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21764657][21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
А я думал Вы сами хотите проверить.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748356
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

автор топика не удосужился ответить на вопрос о типа колонки Comments, ему походу топик совсем не интересен
...
Рейтинг: 0 / 0
LINQ - проще
    #39748362
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухВМоисеев,

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

ну, допустим, varchar(MAX). возможно, извлекает только по Id. возможно в какой-то журнал извлекает записи, где это поле только первые надцать символов. что дальше?
...
Рейтинг: 0 / 0
25 сообщений из 58, страница 1 из 3
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ - проще
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]