Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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
Asp.net mvc 实体框架是否检查冗余的OrderBy()方法_Asp.net Mvc_Linq_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

Asp.net mvc 实体框架是否检查冗余的OrderBy()方法

Asp.net mvc 实体框架是否检查冗余的OrderBy()方法,asp.net-mvc,linq,entity-framework,asp.net-mvc-4,Asp.net Mvc,Linq,Entity Framework,Asp.net Mvc 4,我有以下存储库模型方法: public IQueryable<AccountDefinition> FindAccountDefinition(string q) { return entities.AccountDefinitions.Include(a => a.SDOrganization) .Where (a=> String.IsNullOrEmpty(q) ||

我有以下存储库模型方法:

public IQueryable<AccountDefinition> FindAccountDefinition(string q)
{
    return entities.AccountDefinitions.Include(a => a.SDOrganization)
                                      .Where (a=> String.IsNullOrEmpty(q) || 
                                              a.ORG_NAME.ToUpper().StartsWith(q.ToUpper()))
                                      .OrderBy(a=>a.ORG_NAME);
}
目前,我在action方法和repository方法中都执行了
OrderBy(a=>a.ORG\u NAME)
。那么实体框架和linq将如何处理这个问题呢。我需要将
OrderBy
保存在repository方法中,因为许多其他操作方法都在调用这个repository方法。在action方法中,我不能应用
ToPagedList
,除非我指定了
OrderB
。因此,我的问题是:-

  • EF&linq将如何处理重复的
    OrberBy

  • 而且,
    OrderBy
    是在数据库级别还是在服务器上完成的

  • 谢谢

    编辑 以下是从sql探查器生成的sql语句,其中有两个OrderBy命令:-

    exec sp_executesql N'SELECT TOP (15) 
    [Project1].[C1] AS [C1], 
    [Project1].[ORG_ID] AS [ORG_ID], 
    [Project1].[LOG_LOGO] AS [LOG_LOGO], 
    [Project1].[HEAD_LOGO] AS [HEAD_LOGO], 
    [Project1].[ORG_NAME] AS [ORG_NAME], 
    [Project1].[HASATTACHMENT] AS [HASATTACHMENT], 
    [Project1].[LOGIN_URI] AS [LOGIN_URI], 
    [Project1].[SUPPORT_EMAIL] AS [SUPPORT_EMAIL], 
    [Project1].[DEFAULTSITEID] AS [DEFAULTSITEID], 
    [Project1].[ORG_ID1] AS [ORG_ID1], 
    [Project1].[NAME] AS [NAME], 
    [Project1].[CREATEDTIME] AS [CREATEDTIME], 
    [Project1].[DESCRIPTION] AS [DESCRIPTION]
    FROM ( SELECT [Project1].[ORG_ID] AS [ORG_ID], [Project1].[LOG_LOGO] AS [LOG_LOGO], [Project1].[HEAD_LOGO] AS [HEAD_LOGO], [Project1].[ORG_NAME] AS [ORG_NAME], [Project1].[HASATTACHMENT] AS [HASATTACHMENT], [Project1].[LOGIN_URI] AS [LOGIN_URI], [Project1].[SUPPORT_EMAIL] AS [SUPPORT_EMAIL], [Project1].[DEFAULTSITEID] AS [DEFAULTSITEID], [Project1].[ORG_ID1] AS [ORG_ID1], [Project1].[NAME] AS [NAME], [Project1].[CREATEDTIME] AS [CREATEDTIME], [Project1].[DESCRIPTION] AS [DESCRIPTION], [Project1].[C1] AS [C1], row_number() OVER (ORDER BY [Project1].[ORG_NAME] ASC) AS [row_number]
        FROM ( SELECT 
            [Extent1].[ORG_ID] AS [ORG_ID], 
            [Extent1].[LOG_LOGO] AS [LOG_LOGO], 
            [Extent1].[HEAD_LOGO] AS [HEAD_LOGO], 
            [Extent1].[ORG_NAME] AS [ORG_NAME], 
            [Extent1].[HASATTACHMENT] AS [HASATTACHMENT], 
            [Extent1].[LOGIN_URI] AS [LOGIN_URI], 
            [Extent1].[SUPPORT_EMAIL] AS [SUPPORT_EMAIL], 
            [Extent1].[DEFAULTSITEID] AS [DEFAULTSITEID], 
            [Extent2].[ORG_ID] AS [ORG_ID1], 
            [Extent2].[NAME] AS [NAME], 
            [Extent2].[CREATEDTIME] AS [CREATEDTIME], 
            [Extent2].[DESCRIPTION] AS [DESCRIPTION], 
            1 AS [C1]
            FROM  [dbo].[AccountDefinition] AS [Extent1]
            INNER JOIN [dbo].[SDOrganization] AS [Extent2] ON [Extent1].[ORG_ID] = [Extent2].[ORG_ID]
            WHERE (@p__linq__0 IS NULL) OR (( CAST(LEN(@p__linq__0) AS int)) = 0) OR (( CAST(CHARINDEX(UPPER(@p__linq__1), UPPER([Extent1].[ORG_NAME])) AS int)) = 1)
        )  AS [Project1]
    )  AS [Project1]
    WHERE [Project1].[row_number] > 0
    ORDER BY [Project1].[ORG_NAME] ASC',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=NULL,@p__linq__1=NULL
    
    1) EF&linq将如何处理重复的OrberBy

    它将忽略第二个OrderBy,因为指定多个
    OrderBy
    子句的正确方法是先使用OrderBy,然后再使用
    ThenBy

    2) OrderBy是在数据库级别还是在服务器上完成的

    在DB级别,因为在调用执行该语句的
    ToPagedList
    之前,您将其应用于
    IQueryable

    1) EF&linq将如何处理重复的OrberBy

    它将忽略第二个OrderBy,因为指定多个
    OrderBy
    子句的正确方法是先使用OrderBy,然后再使用
    ThenBy

    2) OrderBy是在数据库级别还是在服务器上完成的


    在DB级别,因为在调用执行该语句的
    ToPagedList
    之前,您要将其应用于
    IQueryable

    我想,您必须在控制器中调用
    OrderBy
    ,由于
    ToPagedList
    方法需要
    IOrderedQueryable
    而不是
    IQueryable
    作为参数,那么从存储库返回
    IOrderedQueryable
    怎么样

    public IOrderedQueryable<AccountDefinition> FindAccountDefinition(string q) {
      return entities.AccountDefinitions
        .Include(a => a.SDOrganization)
        .Where (a => String.IsNullOrEmpty(q) || 
                     a.ORG_NAME.ToUpper().StartsWith(q.ToUpper()))
        .OrderBy(a=>a.ORG_NAME);
    }
    
    public IOrderedQueryable FindAccountDefinition(字符串q){
    返回实体.AccountDefinitions
    .Include(a=>a.sdo组织)
    .Where(a=>String.IsNullOrEmpty(q)|
    a、 ORG_NAME.ToUpper().StartsWith(q.ToUpper())
    .OrderBy(a=>a.ORG\u名称);
    }
    

    默认情况下,
    OrderBy
    返回
    IOrderQueryable
    ,因此没有开销,其他方法不应受到此更改的影响。

    我想,您必须在控制器中调用
    OrderBy
    ,由于
    ToPagedList
    方法需要
    IOrderedQueryable
    而不是
    IQueryable
    作为参数,那么从存储库返回
    IOrderedQueryable
    怎么样

    public IOrderedQueryable<AccountDefinition> FindAccountDefinition(string q) {
      return entities.AccountDefinitions
        .Include(a => a.SDOrganization)
        .Where (a => String.IsNullOrEmpty(q) || 
                     a.ORG_NAME.ToUpper().StartsWith(q.ToUpper()))
        .OrderBy(a=>a.ORG_NAME);
    }
    
    public IOrderedQueryable FindAccountDefinition(字符串q){
    返回实体.AccountDefinitions
    .Include(a=>a.sdo组织)
    .Where(a=>String.IsNullOrEmpty(q)|
    a、 ORG_NAME.ToUpper().StartsWith(q.ToUpper())
    .OrderBy(a=>a.ORG\u名称);
    }
    


    默认情况下,
    OrderBy
    返回
    IOrderQueryable
    ,因此没有开销,其他方法不应受到此更改的影响。

    它在数据库级别完成,与在ToPagedList调用之前一样。您看过生成的SQL吗?我怀疑它只是执行了两次命令。我知道我可以检查Sql分析器,但我想首先了解EF是如何处理它的?我不认为ToPagedList之前或之后的命令顺序会有任何区别。我认为从DAL返回
    IQueryable
    有点危险。@Magnus,为什么危险。许多msdn文章和书籍都提供了这种方法。。。你能解释一下你的观点吗?@JohnJohn,因为你(可能)不知道DAL返回后它是如何使用的,并且你无法控制生成什么样的SQL查询。它在db级别完成,就像在你调用ToPagedList之前一样。您看过生成的SQL吗?我怀疑它只是执行了两次命令。我知道我可以检查Sql分析器,但我想首先了解EF是如何处理它的?我不认为ToPagedList之前或之后的命令顺序会有任何区别。我认为从DAL返回
    IQueryable
    有点危险。@Magnus,为什么危险。许多msdn文章和书籍都提供了这种方法。。。你能解释一下你的观点吗?@JohnJohn,因为你(可能)不知道DAL返回后它是如何使用的,你无法控制生成什么样的SQL查询。即使使用了
    ThenBy
    ,如果它在同一列中,它也会被剥离。你的意思是它会忽略操作方法orderBY吗?是的,如果您指定它两次,它将忽略它。我的意思是它会忽略第二个。SQL查询将很好。您可以检查我的编辑吗,我有SQL profiler SQL语句的副本。我看到了两个OrderBy命令。这是否意味着OrderBy要执行两次?如果您对查询的性能有一些顾虑,请毫不犹豫地通过SQL数据库引擎优化顾问运行此查询。它将分析SQL查询并告诉您是否可以进行一些优化。即使使用了
    ThenBy
    ,如果它在同一列中,它也将被剥离。您的意思是它将忽略操作方法orderBY?是的,如果您指定两次,它将忽略它。我的意思是它会忽略第二个。SQL查询将很好。您可以检查我的编辑吗,我有SQL profiler SQL语句的副本。我看到了两个OrderBy命令。这是否意味着OrderBy要执行两次?如果您对查询的性能有一些顾虑,请毫不犹豫地通过SQL数据库引擎优化顾问运行此查询。它将分析SQL查询并告诉您是否可以进行一些优化。