【问题标题】:Linq to SQL sort by fields in 2 entities (parent-child)Linq to SQL 按 2 个实体(父子)中的字段排序
【发布时间】:2014-04-11 06:53:16
【问题描述】:

我有 2 个实体,分别称为 Request 和 Days。请求有很多天,我遇到的问题是以我想要的方式正确排序我的实体。

Days 有一个名为 Hours 的字段,我需要先按 Hours 字段以天为单位对其进行排序(但是,首先是所有只有一天的字段),然后是请求中的天数。

我尝试了很多 orderby/thenby 组合,但都无法完全正确。

这是我最近尝试过的一个:

sortingFunction = x => x.Days.OrderBy(h => h.Hours).Count();

有什么帮助吗?

【问题讨论】:

  • 在“OrderBy”之后使用“ThenBy”:stackoverflow.com/a/3047467/1380061
  • 目前尚不清楚您将如何按天数对请求进行排序。每个请求都有很多天。您想按小时总和、平均小时数还是分钟小时数排序?
  • ThenBy 和 OrderBy 不起作用,可能是因为这是在不同的实体上。 @SergeyBerezovskiy 每天都有一个小时字段,我需要在请求中的天数为 1 的情况下升序排序,然后按请求中的天数排序(我之前使用 Count())
  • 还不清楚你想做什么,给我们看更多代码。
  • 代码的哪一部分在这种情况下会有所帮助?我需要得到一个按我提到的方式排序的请求列表。 var reqs = db.Requests.OrderBy(..);我需要一个适当的查询来放置内部顺序,以便按照我解释的规则进行排序?由于请求有一天或多天,天有一个名为小时的字段,我需要对其进行排序,因此第一个元素是所有有一天的请求,并按小时升序排序,之后,所有请求都带有更多不是一个按升序排列的请求,所以基本上它是从最少几小时到最多几天排序的

标签: c# sql linq entity-framework


【解决方案1】:
from r in db.Requests
let daysCount = r.Days.Count()
orderby daysCount == 1 ? r.Days.FirstOrDefault().Hours : Int32.MaxValue, 
        daysCount
select r

生成的 SQL 查询将如下所示:

SELECT
[Project4].[Id] AS [Id],
[Project4].[Foo] AS [Foo]
FROM ( SELECT
    CASE WHEN ((1 = [Project3].[C1]) AND ([Project3].[C1] IS NOT NULL)) 
         THEN [Project3].[C2] ELSE 2147483647 END AS [C1],
    [Project3].[Id] AS [Id],
    [Project3].[Foo] AS [Foo]
    [Project3].[C1] AS [C2]
    FROM ( SELECT
        [Project1].[Id] AS [Id],
        [Project1].[Foo] AS [Foo]
        [Project1].[C1] AS [C1], // count of days
        (SELECT TOP (1) // C2 is hours of first day
            [Extent3].[Hours] AS [Hours]
            FROM [dbo].[Days] AS [Extent3]
            WHERE [Project1].[Id] = [Extent3].[RequestId]) AS [C2]
        FROM (SELECT
            [Extent1].[Id] AS [Id],
            [Extent1].[Foo] AS [Foo]
            (SELECT
                COUNT(1) AS [A1]
                FROM [dbo].[Days] AS [Extent2]
                WHERE [Extent1].[Id] = [Extent2].[RequestId]) AS [C1]
            FROM [dbo].[Requests] AS [Extent1]
        )  AS [Project1]
    )  AS [Project3]
)  AS [Project4]
ORDER BY [Project4].[C1] ASC, [Project4].[C2] ASC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多