运行已分配任务的计数

时间:2014-05-05 22:19:49

标签: c# sql asp.net-mvc entity-framework

我正在使用一个带有两个表的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;
    }

我现在完全迷失了,所以任何建议都会非常感激。

2 个答案:

答案 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 });
      }
   }
}

使用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数组的新值来替换您的网格)...