powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Можно ли впихнуть в LINQ to SQL сложную конструкцию с проверкой результата SUM()?
2 сообщений из 2, страница 1 из 1
Можно ли впихнуть в LINQ to SQL сложную конструкцию с проверкой результата SUM()?
    #39886197
KellyLynch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть C# приложение. Оно использует EntityFramework.6.2.0 для доступа к базе SQL Server 2012.
Мне понадобилось в приложении выполнить через LINQ to SQL следующий запрос:

Таблицы используемые запросом:
Код: sql
1.
2.
3.
CREATE TABLE [Work.Work] (
    [WorkCode] INT          IDENTITY (1, 1) NOT NULL
)


Вторая таблица – дочерняя по отношению к [Work.Work], несколько её строк приходятся на одну строку [Work.Work]:
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE [Work.WorkContributor] (
    [WorkContributorID]    INT            IDENTITY (1, 1) NOT NULL,
    [WorkCode]             INT            NOT NULL,
    [MechanicalShare]      DECIMAL (9, 4) NOT NULL,
)



Собственно запрос (на SQL):
Код: sql
1.
2.
3.
4.
5.
6.
select * from [Work.Work] w
CROSS APPLY (select isnull(sum(wc.MechanicalShare), 0) as Sum from [Work.WorkContributor] wc
				where wc.WorkCode = w.WorkCode
					
	) subQuery
where subQuery.Sum between 99.9 and 100.1



Мне надо создать на LINQ to SQL аналог этого SQL запроса.
У меня пока получилось написать LINQ to SQL конструкцию которая содержит ДВА подзапроса к дочерним строкам [Work.WorkContributor] с вычислением этой SUM(wc.MechanicalShare). Результат первого подзапроса я сравниваю ‘>= 99.9’. Результат второго подзапроса я сравниваю ‘<=100.1’.
В результате всё это работает – но в реальном SQL запросе так и вычисляются ДВА подзапроса к дочерним строкам [Work.WorkContributor]. Что будет работать медленно.
А как сделать так чтобы LINQ to SQL содержал всего один подзапрос к [Work.WorkContributor]; и чтобы в реальном SQL запросе тоже присутствовал всего один такой подзапрос?
...
Рейтинг: 0 / 0
Можно ли впихнуть в LINQ to SQL сложную конструкцию с проверкой результата SUM()?
    #39886240
KellyLynch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дополнение:

"У меня пока получилось написать LINQ to SQL конструкцию которая содержит ДВА подзапроса к дочерним строкам" - вот она:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
var works = entityFrameworkContextObject.Work_Work.AsNoTracking();
works = from w in works
                        where ((99.9m < (from wc in w.Work_WorkContributor
                                     select new
                                     {
                                         toSum = wc.MechanicalShare
                                     }
                                ).Select(x => x.toSum).Sum()
                               )
                               &&
                               (100.1m > (from wc in w.Work_WorkContributor
                                       select new
                                       {
                                           toSum = wc.MechanicalShare
                                       }
                                ).Select(x => x.toSum).Sum()
                               )
                              )
select w;




Yes, it works – but a real SQL query to the DB has TWO separate sub-queries to [Work.WorkContributor]. It will work slow.

Here is the real SQL query:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT 
    [Project2].[WorkCode] AS [WorkCode]
    FROM ( SELECT 
        [Project1].[WorkCode] AS [WorkCode], 
        [Project1].[C1] AS [C1], 
        (SELECT 
            SUM([Extent3].[MechanicalShare]) AS [A1]
            FROM [dbo].[Work.WorkContributor] AS [Extent3]
            WHERE [Project1].[WorkCode] = [Extent3].[WorkCode]) AS [C2]
        FROM ( SELECT 
            [Extent1].[WorkCode] AS [WorkCode], 
            (SELECT 
                SUM([Extent2].[MechanicalShare]) AS [A1]
                FROM [dbo].[Work.WorkContributor] AS [Extent2]
                WHERE [Extent1].[WorkCode] = [Extent2].[WorkCode]) AS [C1]
            FROM [dbo].[Work.Work] AS [Extent1]
        )  AS [Project1]
    )  AS [Project2]
    WHERE (99.9 < [Project2].[C1]) AND (100.1 > [Project2].[C2])
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Можно ли впихнуть в LINQ to SQL сложную конструкцию с проверкой результата SUM()?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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