C# ASP.NET核心EF查询在对子查询使用Skip/Take时忽略OrderBy
我的应用程序在使用asp.net core 1.1和mvc时遇到问题。尽我所能,在执行查询、组合orderby、skip/take和对包含的表进行查询时,我得到的结果不正确 这个模式非常直截了当C# ASP.NET核心EF查询在对子查询使用Skip/Take时忽略OrderBy,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我的应用程序在使用asp.net core 1.1和mvc时遇到问题。尽我所能,在执行查询、组合orderby、skip/take和对包含的表进行查询时,我得到的结果不正确 这个模式非常直截了当 public Class Member { public int Id {get; set;} public int Family {get; set;} public bool IsMember {get; set;} public DateTime DeceasedD
public Class Member
{
public int Id {get; set;}
public int Family {get; set;}
public bool IsMember {get; set;}
public DateTime DeceasedDate {get; set;}
...
public int LivesWithId {get; set;}
public Member LivesWith {get; set;}
public ICollection<Member> LivingWith {get; set;}
}
实体框架接受了这一点,并给出了两个查询。我不完全确定这是为什么,我认为第一个查询包含了所需的一切。。。但重要的是实体框架似乎放弃了排序,我不明白为什么。以下是由此生成的SQL:
SELECT [t].[Id], [t].[Family], (...some fields omitted...)
FROM (
SELECT [m].[Id], [m].[Family], (...some fields omitted...) ROW_NUMBER() OVER(ORDER BY [m].[Family]) AS [__RowNumber__]
FROM [Members] AS [m]
WHERE (([m].[IsMember] = 1) OR ((
SELECT COUNT(*)
FROM [Members] AS [s]
WHERE [s].[DeceasedDate] IS NULL AND ([m].[Id] = [s].[LivesWithId])
) > 0))
) AS [t]
WHERE ([t].[__RowNumber__] > @__p_0) AND ([t].[__RowNumber__] <= (@__p_0 + @__p_1))
ORDER BY [t].[Id]
SELECT [m0].[Id], [m0].[Family], (...some fields omitted...)
FROM [Members] AS [m0]
WHERE EXISTS (
SELECT 1
FROM (
SELECT [m].[Id], [m].[Family], (...some fields omitted...), ROW_NUMBER() OVER(ORDER BY [m].[Family]) AS [__RowNumber__]
FROM [Members] AS [m]
WHERE ([m].[IsMember] = 1) OR ((
SELECT COUNT(*)
FROM [Members] AS [s]
WHERE [s].[DeceasedDate] IS NULL AND ([m].[Id] = [s].[LivesWithId])
) > 0)
) AS [t]
WHERE (([t].[__RowNumber__] > @__p_0) AND ([t].[__RowNumber__] <= (@__p_0 + @__p_1))) AND ([m0].[LivesWithId] = [t].[Id]))
ORDER BY [m0].[LivesWithId]
这可能并不明显,但实体框架正在做一些有趣的事情,打破了指定的顺序。它使用skip/take正确地拆分组,但它不会在该组中对结果进行排序,因为它在最后的orderby id中进行了转换。我不完全确定实体框架是否做错了什么,当然也不确定我是否做错了。我想我的查询可能不是很好,但我很难进行一个查询,因为它不会对每个结果行执行单独的查询
编辑:在评论中,它似乎是由EF错误引起的。现在,我可以通过在跳过/执行之后放置第二个命令来解决这个问题我不确定,请尝试更改q=q.Wherem=>m.IsMember | | m.LivingWith.Counts=>s.DecesedDate==null>0;to q=q.Wherem=>m.IsMember | | m.LivingWith.Wheres=>s.DecesedDate==null.Count>0@doddler在一张无关的便笺上不使用count使用任何m.LivingWith.Anys=>s.decesedDate!=null@johnny5是的,我忘了任何一个。我会用Where.Count,如果我必须检查其他任何东西,比如Count>10。如果我记得清楚的话,我们不能对lambda使用计数重载,因为它会延迟SQL执行。这是一个镜头,但是…你确定那是准确的密码吗?为什么一次调用会生成两条SQL语句。我感觉你在C代码中省略了一些东西。或者,所有东西都由FamilyId订购,并且只有多个成员属于该家族。这是一个已经修复的bug,将在下一版本中提供。
SELECT [t].[Id], [t].[Family], (...some fields omitted...)
FROM (
SELECT [m].[Id], [m].[Family], (...some fields omitted...) ROW_NUMBER() OVER(ORDER BY [m].[Family]) AS [__RowNumber__]
FROM [Members] AS [m]
WHERE (([m].[IsMember] = 1) OR ((
SELECT COUNT(*)
FROM [Members] AS [s]
WHERE [s].[DeceasedDate] IS NULL AND ([m].[Id] = [s].[LivesWithId])
) > 0))
) AS [t]
WHERE ([t].[__RowNumber__] > @__p_0) AND ([t].[__RowNumber__] <= (@__p_0 + @__p_1))
ORDER BY [t].[Id]
SELECT [m0].[Id], [m0].[Family], (...some fields omitted...)
FROM [Members] AS [m0]
WHERE EXISTS (
SELECT 1
FROM (
SELECT [m].[Id], [m].[Family], (...some fields omitted...), ROW_NUMBER() OVER(ORDER BY [m].[Family]) AS [__RowNumber__]
FROM [Members] AS [m]
WHERE ([m].[IsMember] = 1) OR ((
SELECT COUNT(*)
FROM [Members] AS [s]
WHERE [s].[DeceasedDate] IS NULL AND ([m].[Id] = [s].[LivesWithId])
) > 0)
) AS [t]
WHERE (([t].[__RowNumber__] > @__p_0) AND ([t].[__RowNumber__] <= (@__p_0 + @__p_1))) AND ([m0].[LivesWithId] = [t].[Id]))
ORDER BY [m0].[LivesWithId]