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
。因此,我的问题是:-
OrberBy
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查询并告诉您是否可以进行一些优化。