已分配任务的运行计数
本文关键字:运行 分配 任务 | 更新日期: 2023-09-27 18:01:44
我正在工作的MVC EF网站,有一个SQL数据库与两个表:条目,成员。
网站的版主可以给成员分配任务,这些任务将被记录在条目中。
我正试图确定一种方法来优先考虑成员列表,以便具有最少任务量的成员(作为一个始终递增的数字)将始终从顶部排序,以便版主可以根据谁承担了最少的任务来分配。
我探索了在DB本身中这样做:我可以创建一个视图,它将根据成员上的名称检查条目,并提供它们已分配的任务总数。然而;EF/dbContext显然不能与SQL视图一起工作。
我有一个输入条目表到视图的EntryController和一个简单列出成员的MemberController。我的下一个想法是简单地调用MemberController中的一个操作,该操作在调用时增加特定成员的计数数。我不确定这是否是最好的方法,也不确定如何从Html中调用Input-Submit POST。BeginForm和Increment函数。
BeginForm是在EntryController的强类型视图上,所以我也不确定如何将成员传递回成员控制器,所以我使函数根据字符串抓取。first和increment来识别成员:
public void incrementCount(string member)
{
Member[] members = null;
members[0] = (repository.Members.Where(p => p.Name == member).First());
members[0].Count = members[0].Count + 1;
}
在这一点上我完全迷路了,所以任何建议都将非常感谢。
听起来你在这三个方面都迷失了:EF, ASP。. NET MVC和Linq.
IMHO你应该发送HTTP POST
或HTTP PATCH
(取决于上下文&用jQuery(或其他)将请求返回到服务器/控制器,然后增加成员的任务计数。
你的控制器,然后,有一个方法Increment(int memberId)
与一个路由像[Route("/lorem/ipsum/members/increment/{id}")]
,所以你可以从客户端访问它。
这是一种有趣的方法,而不是向服务器发送完整的表单,因为您可以只发送相关的数据(只有memberId而不是整个表单,并且什么也不接收,而不是整个新页面),从而减少服务器负载并提高性能。
现在,对于链接,您可以使用Brendan在Linq下面发布的常规语法,这也应该很好:
var memberId = repository.Entries
.GroupBy(_entry => _entry.MemberId)
.Select(_group => new { Id: _group.Key, Count: _group.Count() })
.OrderBy(_group => _group.Count)
.First().Id;
一些示例来说明可能的方法
首先,这将是我们在ASP上的控制器/方法。NET MVC:
[RoutePrefix("Lorem/Ipsum/Task")]
public class LoremController : Controller
{
[Route("Increment"), HttpPost]
public JsonResult Increment(int id)
{
try
{
// Increment your task count!
return Json(new { Success = true, ErrorMessage = "" });
}
catch(Exception err)
{
return Json(new { Success = false, ErrorMessage = err.Message });
}
}
}
jQuery示例<div class="blabla">
<button id="btnIncrement" class="btn btn-primary" type="button" data-member-id="1">
Increment!
</button>
</div>
<script>
$("#btnIncrement").on("click", function() {
var _this = $(this);
$.ajax({
url: "/lorem/ipsum/task/increment",
data: { MemberId: _this.data("member-id") },
method: "POST",
success: function(json) {
if (json.Success) alert ('Success!');
else alert(json.ErrorMessage);
},
error: function () { alert("error!); }
});
});
</script>
示例使用一个简单的表单(非jquery/javascript)<form action="/lorem/ipsum/task/increment" method="POST">
<input type="hidden" name="MemberId" value="1" />
<button type="submit" class="btn btn-primary">Increment!</button>
</form>
使用Angular.JS的示例
<div ng-app>
<button ng-controller="lalaController" ng-click="increment(1)" class="btn btn-primary" type="button>
Increment!
</button>
</div>
<script>
angular.controller("lalaController", ["$scope", "$http", function($scope, $http) {
$scope.increment = function(id) {
$http({ url: "/lorem/ipsum/task/increment", data: { MemberId: id }, method: POST })
.success(function(json) {
if (json.Success) alert ("Success!");
else alert(json.ErrorMessage);
})
.error(function() { alert("Error!"); });
}
}]);
</script>
用纯HTML听起来当然有趣多了。
但现在,尝试禁用该按钮,除非它是素数。这对于纯HTML来说是不可能的。此外,尝试验证您的输入或解析响应(例如:使用新值的JSON数组更新页面上的网格)…
你可以通过Linq:
var query = from e in repository.Entries
group e by e.MemberId into g
select new
{
name = g.Key,
count = g.Count()
};
将返回成员id的列表以及他们拥有的Entry记录的数量。