我正在使用一个带有两个表的SQL DB的MVC EF站点: 参赛作品,会员。
网站的版主可以将任务分配给会员,这些会员将登录参赛作品。
我正在尝试确定一种优先处理成员列表的方法,以便具有最少任务量的成员(作为始终递增的数字)将始终从顶部开始OrderBy,以便主持人可以根据谁拥有承担了最少量的任务。
我探讨了在数据库本身中执行此操作:我可以创建一个视图,该视图将根据成员上的名称检查条目,并提供已分配的任务总数。然而; EF / dbContext显然不适用于SQL视图。
我有一个EntryController,它将Entries表提供给View和一个只列出成员的MemberController。我的下一个想法是简单地在MemberController中调用一个动作,该动作在被调用时递增特定成员的计数。我不确定这是否是最好的方法,或者我怎么能同时调用Html.BeginForm和Increment函数中的Input-Submit POST。
BeginForm是在EntryController的强类型视图上,所以我也不确定如何将一个成员传递回成员控制器,所以我做了一个函数来识别基于字符串抓取的成员。和增量:
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;
}
我现在完全迷失了,所以任何建议都会非常感激。
答案 0 :(得分:1)
您可以通过Linq执行此操作:
var query = from e in repository.Entries
group e by e.MemberId into g
select new
{
name = g.Key,
count = g.Count()
};
将返回会员ID列表以及他们拥有的条目记录数。
答案 1 :(得分:1)
听起来你在所有3:EF,ASP.NET MVC和Linq上迷失了。
恕我直言,您应该将一个HTTP POST
或一个HTTP PATCH
(取决于上下文和解释)请求与jQuery(或其他)一起发送回您的服务器/控制器,然后将增加任务计数会员。
然后,您的控制器会有一个方法Increment(int memberId)
,其路由类似[Route("/lorem/ipsum/members/increment/{id}")]
,因此您可以从客户端访问它。
这是一个有趣的方法,而不是服务器的完整表单发布,因为您只能发送相关数据(只有memberId而不是整个表单并且不接收任何内容,而不是整个新页面),从而减少服务器负载并增加性能
现在,对于链接,您可以使用常规语法,如Brendan发布的Linq bellow,也应该没问题:
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 });
}
}
}
<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>
<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>
<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数组的新值来替换您的网格)...