已分配任务的运行计数

本文关键字:运行 分配 任务 | 更新日期: 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 POSTHTTP 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记录的数量。