我在我的控制器中有这个请求:
var documents = (from t in db.fooDocument
where (t.DocumentTypeID == 1 || t.DocumentTypeID == 2 || t.DocumentTypeID == 5) && t.ObjectID == objectID && t.RecordStatusID != 2
orderby t.DocDate
select new
{
t.DocumentID,
t.DocDate,
t.RegNumber,
t.UserID,
t.RecordDate,
t.RecordStatusID,
t.RegistrationDate,
t.Number,
t.Description,
t.ObjectID,
t.DocumentTypeID,
t.ContragentName,
DocumentTypeName = t.fooDocumentType.Name,
Summa = t.fooIncDocDetail.Where(d => d.RecordStatusID == 1).Sum(a => (decimal?)( a.Amount * a.Price + (a.Amount * a.Price) * (a.VATRate/100))) ?? 0
}).Skip(pagesize * pagenum).Take(pagesize);
当在sql profiler中执行此请求时,它将转换为此moster:
exec sp_executesql N'SELECT TOP (10)
[Project4].[DocumentTypeID] AS [DocumentTypeID],
[Project4].[DocumentID] AS [DocumentID],
[Project4].[DocDate] AS [DocDate],
[Project4].[RegNumber] AS [RegNumber],
[Project4].[UserID] AS [UserID],
[Project4].[RecordDate] AS [RecordDate],
[Project4].[RecordStatusID] AS [RecordStatusID],
[Project4].[RegistrationDate] AS [RegistrationDate],
[Project4].[Number] AS [Number],
[Project4].[Description] AS [Description],
[Project4].[ObjectID] AS [ObjectID],
[Project4].[ContragentName] AS [ContragentName],
[Project4].[Name] AS [Name],
[Project4].[C1] AS [C1]
FROM ( SELECT [Project4].[DocumentID] AS [DocumentID], [Project4].[DocumentTypeID] AS [DocumentTypeID], [Project4].[DocDate] AS [DocDate], [Project4].[RegNumber] AS [RegNumber], [Project4].[UserID] AS [UserID], [Project4].[RecordDate] AS [RecordDate], [Project4].[RecordStatusID] AS [RecordStatusID], [Project4].[RegistrationDate] AS [RegistrationDate], [Project4].[Number] AS [Number], [Project4].[Description] AS [Description], [Project4].[ObjectID] AS [ObjectID], [Project4].[ContragentName] AS [ContragentName], [Project4].[Name] AS [Name], [Project4].[C1] AS [C1], row_number() OVER (ORDER BY [Project4].[DocDate] ASC) AS [row_number]
FROM ( SELECT
[Project3].[DocumentID] AS [DocumentID],
[Project3].[DocumentTypeID] AS [DocumentTypeID],
[Project3].[DocDate] AS [DocDate],
[Project3].[RegNumber] AS [RegNumber],
[Project3].[UserID] AS [UserID],
[Project3].[RecordDate] AS [RecordDate],
[Project3].[RecordStatusID] AS [RecordStatusID],
[Project3].[RegistrationDate] AS [RegistrationDate],
[Project3].[Number] AS [Number],
[Project3].[Description] AS [Description],
[Project3].[ObjectID] AS [ObjectID],
[Project3].[ContragentName] AS [ContragentName],
[Project3].[Name] AS [Name],
CASE WHEN ([Project3].[C1] IS NULL) THEN cast(0 as decimal(18)) ELSE [Project3].[C2] END AS [C1]
FROM ( SELECT
[Project2].[DocumentID] AS [DocumentID],
[Project2].[DocumentTypeID] AS [DocumentTypeID],
[Project2].[DocDate] AS [DocDate],
[Project2].[RegNumber] AS [RegNumber],
[Project2].[UserID] AS [UserID],
[Project2].[RecordDate] AS [RecordDate],
[Project2].[RecordStatusID] AS [RecordStatusID],
[Project2].[RegistrationDate] AS [RegistrationDate],
[Project2].[Number] AS [Number],
[Project2].[Description] AS [Description],
[Project2].[ObjectID] AS [ObjectID],
[Project2].[ContragentName] AS [ContragentName],
[Project2].[Name] AS [Name],
[Project2].[C1] AS [C1],
(SELECT
SUM([Filter3].[A1]) AS [A1]
FROM ( SELECT
([Extent4].[Amount] * [Extent4].[Price]) + ([Extent4].[Amount] * [Extent4].[Price] * ([Extent4].[VATRate] / cast(100 as decimal(18)))) AS [A1]
FROM [dbo].[fooIncDocDetail] AS [Extent4]
WHERE ([Project2].[DocumentID] = [Extent4].[DocumentID]) AND (1 = [Extent4].[RecordStatusID])
) AS [Filter3]) AS [C2]
FROM ( SELECT
[Project1].[DocumentID] AS [DocumentID],
[Project1].[DocumentTypeID] AS [DocumentTypeID],
[Project1].[DocDate] AS [DocDate],
[Project1].[RegNumber] AS [RegNumber],
[Project1].[UserID] AS [UserID],
[Project1].[RecordDate] AS [RecordDate],
[Project1].[RecordStatusID] AS [RecordStatusID],
[Project1].[RegistrationDate] AS [RegistrationDate],
[Project1].[Number] AS [Number],
[Project1].[Description] AS [Description],
[Project1].[ObjectID] AS [ObjectID],
[Project1].[ContragentName] AS [ContragentName],
[Project1].[Name] AS [Name],
(SELECT
SUM([Filter2].[A1]) AS [A1]
FROM ( SELECT
([Extent3].[Amount] * [Extent3].[Price]) + ([Extent3].[Amount] * [Extent3].[Price] * ([Extent3].[VATRate] / cast(100 as decimal(18)))) AS [A1]
FROM [dbo].[fooIncDocDetail] AS [Extent3]
WHERE ([Project1].[DocumentID] = [Extent3].[DocumentID]) AND (1 = [Extent3].[RecordStatusID])
) AS [Filter2]) AS [C1]
FROM ( SELECT
[Extent1].[DocumentID] AS [DocumentID],
[Extent1].[DocumentTypeID] AS [DocumentTypeID],
[Extent1].[DocDate] AS [DocDate],
[Extent1].[RegNumber] AS [RegNumber],
[Extent1].[UserID] AS [UserID],
[Extent1].[RecordDate] AS [RecordDate],
[Extent1].[RecordStatusID] AS [RecordStatusID],
[Extent1].[RegistrationDate] AS [RegistrationDate],
[Extent1].[Number] AS [Number],
[Extent1].[Description] AS [Description],
[Extent1].[ObjectID] AS [ObjectID],
[Extent1].[ContragentName] AS [ContragentName],
[Extent2].[Name] AS [Name]
FROM [dbo].[fooDocument] AS [Extent1]
INNER JOIN [dbo].[fooDocumentType] AS [Extent2] ON [Extent1].[DocumentTypeID] = [Extent2].[DocumentTypeID]
WHERE ([Extent1].[DocumentTypeID] IN (1,2,5)) AND ([Extent1].[ObjectID] = @p__linq__0) AND (2 <> [Extent1].[RecordStatusID])
) AS [Project1]
) AS [Project2]
) AS [Project3]
) AS [Project4]
) AS [Project4]
WHERE [Project4].[row_number] > 0
ORDER BY [Project4].[DocDate] ASC',N'@p__linq__0 int',@p__linq__0=4
但为什么,我该如何改变呢?在我的请求中,我只是从一个表中获取文档,对于每个文档,我必须在另一个表中计算该文档的所有相对行中的summ