实体框架OrderBy在GroupJoin之后不可能

时间:2017-06-26 11:40:21

标签: c# entity-framework linq-to-sql sql-order-by

我对实体框架ORDER BY上不受欢迎的GroupJoin有疑问。

但首先是我的查询。它是一个带有JOIN和ORDER的简单查询链。

第一步 - 简单条件查询:

var dataQuery = model.InverterData
    .Where(d => d.Timestamp >= from && d.Timestamp < till)
    .Select(d => new
    {
        d.InverterID,
        d.Timestamp
    });

第二步 - OUTER JOIN查询:

var dayDataQuery = model.InverterDayData
    .GroupJoin(dataQuery
    , outer => outer.InverterID
    , inner => inner.InverterID
    , (outer, inner) => new
    {
        outer.InverterID,
        outer.Date,
        outer.DayYield,

        InverterData = inner.Select(d => new
        {
            d.Timestamp
        })
    });

第三步 - ORDER BY:

var orderedQuery = dayDataQuery
    .OrderBy(d => d.DayYield)
    .ThenBy(d => d.InverterID);

我现在的问题是GroupJoin在最后建立了一个带有不需要的ORDER BY的查询。这使我的命令毫无意义。

但详情......

这是在步骤1之后生成的SQL:

SELECT 
    1 AS [C1], 
    [Extent1].[InverterID] AS [InverterID], 
    [Extent1].[Timestamp] AS [Timestamp]
    FROM [data].[InverterData] AS [Extent1]
    WHERE ([Extent1].[Timestamp] >= @p__linq__0) AND ([Extent1].[Timestamp] < @p__linq__1)

看起来不错!

在步骤2之后生成SQL:

SELECT 
    [Project1].[C1] AS [C1], 
    [Project1].[InverterID] AS [InverterID], 
    [Project1].[Date] AS [Date], 
    [Project1].[DayYield] AS [DayYield], 
    [Project1].[C2] AS [C2], 
    [Project1].[Timestamp] AS [Timestamp]
    FROM ( SELECT 
        [Extent1].[InverterID] AS [InverterID], 
        [Extent1].[Date] AS [Date], 
        [Extent1].[DayYield] AS [DayYield], 
        1 AS [C1], 
        [Extent2].[Timestamp] AS [Timestamp], 
        CASE WHEN ([Extent2].[InverterID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
        FROM  [data].[InverterDayData] AS [Extent1]
        LEFT OUTER JOIN [data].[InverterData] AS [Extent2] ON ([Extent2].[Timestamp] >= @p__linq__0) AND ([Extent2].[Timestamp] < @p__linq__1) AND ([Extent1].[InverterID] = [Extent2].[InverterID])
    )  AS [Project1]
    ORDER BY [Project1].[InverterID] ASC, [Project1].[Date] ASC, [Project1].[C2] ASC

添加了不需要的ORDER BY ORDER BY [Project1].[InverterID] ASC, [Project1].[Date] ASC, [Project1].[C2] ASC

在步骤3之后生成SQL:

SELECT 
    [Project1].[InverterID] AS [InverterID], 
    [Project1].[C1] AS [C1], 
    [Project1].[Date] AS [Date], 
    [Project1].[DayYield] AS [DayYield], 
    [Project1].[C2] AS [C2], 
    [Project1].[Timestamp] AS [Timestamp]
    FROM ( SELECT 
        [Extent1].[InverterID] AS [InverterID], 
        [Extent1].[Date] AS [Date], 
        [Extent1].[DayYield] AS [DayYield], 
        1 AS [C1], 
        [Extent2].[Timestamp] AS [Timestamp], 
        CASE WHEN ([Extent2].[InverterID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
        FROM  [data].[InverterDayData] AS [Extent1]
        LEFT OUTER JOIN [data].[InverterData] AS [Extent2] ON ([Extent2].[Timestamp] >= @p__linq__0) AND ([Extent2].[Timestamp] < @p__linq__1) AND ([Extent1].[InverterID] = [Extent2].[InverterID])
    )  AS [Project1]
    ORDER BY [Project1].[DayYield] ASC, [Project1].[InverterID] ASC, [Project1].[Date] ASC, [Project1].[C2] ASC

我的订单(由DayYieldInverterID)无效,因为DateC2现在也包括在内。

问题:

为什么和/或如何使其正常工作? 需要服务器上订单,因为服务器上的分页。

与@IvanStoev相关的答案

你是怎么说的?它在最终订单上产生了巨大的不同。 enter image description here

0 个答案:

没有答案
相关问题