MySQL материализует подзапросы. Так что вы можете попробовать написать это без подзапросов:
SELECT s.student_id,
(ABS(s.x1 - u.x1) + ABS(s.x2 - u.x2) + ABS(s.x3 - u.x3)
) / 3 AS avg_cate_x,
(ABS(s.y1 - u.y1) + ABS(s.y2 - u.y2)
) / 2 AS avg_cate_y,
(ABS(s.z1 - u.z1) + ABS(s.z2 - u.z2) + ABS(s.z3 - u.z3) + ABS(s.z4 - u.z4)
) / 4 AS avg_cate_z,
(5 -
(ABS(s.x1 - u.x1) + ABS(s.x2 - u.x2) + ABS(s.x3 - u.x3)
) / 3 +
(ABS(s.y1 - u.y1) + ABS(s.y2 - u.y2)
) / 2 +
(ABS(s.z1 - u.z1) + ABS(s.z2 - u.z2) + ABS(s.z3 - u.z3) + ABS(s.z4 - u.z4)
) / 4
) / 3 as final_score
FROM scores s JOIN
scores u
ON u.student_id = 1
ORDER by final_score DESC;
Это менее элегантно, чем использование подзапроса, но вы можете увидеть улучшение производительности.
Также поможет индекс scores(student_id)
.
RedirectToAction
просто вспомогательный метод создать RedirectToRouteResult()
, поэтому что Вы делаете, просто создают новое RedirectToRouteResult()
проведение RouteValueDictionary()
со значениями для Вашего действия.
Полная выборка на основе кода от @Domenic в комментарии ниже:
public class IsGuestAttribute: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!Ctx.User.IsGuest)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "controller", "Home" },
{ "action", "Index" }
});
}
}
}
Вот пример кода:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!Ctx.User.IsGuest)
{
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("action", "Index");
redirectTargetDictionary.Add("controller", "Home");
filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
}