Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Можно ли впихнуть в LINQ to SQL сложную конструкцию с проверкой результата SUM()?  [new]
KellyLynch
Member

Откуда:
Сообщений: 94
У меня есть C# приложение. Оно использует EntityFramework.6.2.0 для доступа к базе SQL Server 2012.
Мне понадобилось в приложении выполнить через LINQ to SQL следующий запрос:

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

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


Собственно запрос (на SQL):
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 запросе тоже присутствовал всего один такой подзапрос?
7 ноя 19, 13:46    [22011484]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли впихнуть в LINQ to SQL сложную конструкцию с проверкой результата SUM()?  [new]
KellyLynch
Member

Откуда:
Сообщений: 94
Дополнение:

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

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:

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])
7 ноя 19, 14:46    [22011578]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить