У меня есть приложение на 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-запрос к БД будет иметь только один такой подзапрос?