Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心EF查询在对子查询使用Skip/Take时忽略OrderBy_C#_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# ASP.NET核心EF查询在对子查询使用Skip/Take时忽略OrderBy

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

我的应用程序在使用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 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]