Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ - проще / 25 сообщений из 58, страница 1 из 3
12.12.2018, 23:13
    #39747012
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ - проще
Сегодня осознал, что 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
12.12.2018, 23:22
    #39747015
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ - проще
Не обошлось и без магии компиляйтора

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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