Могу ли я использовать в LINQ to SQL CROSS APPLY с проверкой его SUM ()? - PullRequest
0 голосов
/ 07 ноября 2019

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

CREATE TABLE [Work.Work] (
    [WorkCode] INT          IDENTITY (1, 1) NOT NULL
)

2-я таблицаребенок от [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,
)

Запрос (на T-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

Мне нужно создать аналог этого запроса SQLиспользуя LINQ to SQL.
Мне удалось создать код LINQ to SQL с ДВУМЯ подзапросами к дочерним строкам [Work.WorkContributor] с вычислением SUM (wc.MechanicalShare). Результат 1-го подзапроса я сравниваю '> = 99,9'. Результат второго подзапроса я сравниваю '<= 100,1'. <br>

Вот оно:

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;

Да, это работает - но настоящий SQL-запрос кБД имеет ДВА отдельных подзапроса к [Work.WorkContributor]. Это будет работать медленно.

Вот реальный запрос SQL:

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])

Можно ли создать код LINQ to SQL только с одним подзапросом для [Work.WorkContributor];а реальный SQL-запрос к БД будет иметь только один такой подзапрос?

...