小编Chr*_*aws的帖子

使用属性路由时如何获得Mvc 5 Controller的ActionDescriptor?

我试图在使用属性路由的控制器上获取ActionDescriptor,但它始终为null.

var controllerDescriptor = new ReflectedControllerDescriptor(controllerType);
var actionDescriptor = 
    controllerDescriptor.FindAction(controllerContext, actionName) ??
    controllerDescriptor.GetCanonicalActions().FirstOrDefault(a => a.ActionName == actionName);
Run Code Online (Sandbox Code Playgroud)

从我的研究中,我发现在ActionMethodSelectorBase类中有一个名为PopulateLookupTables的方法,它将你给它的控制器中的所有方法分开.在其中的方法中,它将MethodInfo的列表过滤为2组列表.

  • AliasedMethods - 没有使用ActionNameSelectorAttribute修饰的直接路由的所有操作方法.
  • NonAliasedMethods - 没有未使用ActionNameSelectorAttribute修饰的直接路由的所有操作方法.

注意:如果在控制器级别设置了直接路由(RouteAttribute),则AliasedMethods和NonAliasedMethods将为空.

注意:直接路由被定义为控制器中的方法(不包括构造函数和事件),并使用从IRouteInfoProvider或IDirectRouteFactory继承的属性进行修饰(RouteAttribute继承自这两者).

  • DirectRouteMethods - 使用某种形式的IRouteInfoProvider直接装饰它们的方法.
  • StandardRouteMethods - 没有IRouteInfoProvider直接装饰它们的方法.(包括具有RouteAttribute的控制器中的操作方法,但该方法没有RouteAttribute).

ReflectedControllerDescriptor.FindAction被调用,它在内部调用ActionMethodSelectorBase.FindActionMethods只着眼于AliasedMethodsNonAliasedMethods(其中不包括与直连路由的所有操作).

ReflectedControllerDescriptor.GetCanonicalActions被调用,它在内部调用ReflectedControllerDescriptor.GetAllActionMethodsFromSelector只着眼于AliasedMethodsNonAliasedMethods(其中exlude与直连路由的所有操作).

从我所看到的,DirectRouteMethods仅在一个地方使用,即RouteCollection.MapMvcAttributeRoutes扩展方法.这意味着RouteTable.Routes集合有一个RouteCollectionRoute到操作但我不知道如何到达它.

有没有人知道如何为具有RouteAttribute的操作获取ActionDescriptor

c# asp.net-mvc asp.net-mvc-routing attributerouting asp.net-mvc-5

9
推荐指数
1
解决办法
2402
查看次数

当我将值设置为变量时,为什么我的SQL语句需要花费N倍的时间来运行?

我想说的第一件事是,这并不是我想要实现的目标.我已经愚弄了这个问题很多,以便更清楚地解决我的问题.

我在表(CallDetail)上有两个值的非聚集索引,TermDate(int)和SourceSystemID(int).为了完整,我将在此处包含索引的精确定义:

CREATE NONCLUSTERED INDEX [CallDetail_TermDateSourceSystemID] ON [dbo].[CallDetail] 
(
    [TermDate] ASC,
    [SourceSystemID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我对这个表运行两个几乎相同的查询时,我得不到相同的结果(不要与结果集混淆).第一个查询在不到一秒的时间内运行并返回大约10,000行.第二个查询在执行时继续运行,直到我在大约30分钟后取消它.

查询1(~1秒):

SELECT
    *
FROM
    CallDetail
WHERE
    CallDetail.TermDate >= 1101221 AND
    SourceSystemID = 1
Run Code Online (Sandbox Code Playgroud)

查询2(> 30分钟):

DECLARE @TermDate AS INT
SET @TermDate = 1101221

SELECT
    *
FROM
    CallDetail
WHERE
    CallDetail.TermDate >= @TermDate AND
    SourceSystemID = 1
Run Code Online (Sandbox Code Playgroud)

我想要注意的是查询执行计划告诉我在索引中"包含"该表的所有列.我发现这是完全错误的.我还要注意,如果我只选择TermDate和SourceSystemID而不是*,我会在大约1秒内得到结果.

是否有理由在使用变量而不是将值硬编码到需要更长时间的位置?我完全被这个难以接受,任何帮助都将非常感激.

谢谢!

克里斯托弗哈斯

sql variables indexing long-integer

5
推荐指数
1
解决办法
2727
查看次数

在TFS中,是否可以创建一个返回所有前任处于关闭或已解决状态的工作项的查询?

我想在TFS中创建一个查询,允许我只查看当前可以处理的工作项(所有前面的工作项都已关闭或已解决).这可能吗?

tfs tfs-workitem

3
推荐指数
1
解决办法
3739
查看次数