我必须根据用户输入的百分比将客户分配给不同的员工。例如,我有10个属于salesman3的客户,我为salesman1输入50%,为salesman2输入50%。这意味着其中5个客户转到salesman1,另外5个转到salesman2。我想通过更新数据库中的销售员ID来实现这一点。我已经放入了一些计数器,以确保它输入的百分比和循环遍及整个销售人员列表。它证明它正在运行整个foreach循环并获得百分比,但是当我检查数据库时它只更新一次。这是我的代码。如果我这里没有东西,我很抱歉。我是新用户和初学者编码器。感谢。
public ActionResult Submit(string json, string terminated_id, string total_clients)
{
int T_ID = Convert.ToInt32(terminated_id);
int T_clients = Convert.ToInt32(total_clients);
List<emp_info> list = JsonConvert.DeserializeObject<List<emp_info>>(json);
int counter = 0;
foreach (var obj in list)
{
counter++;
}
int counting = 0;
string[] array = new string[counter];
int i = 0;
foreach (var obj in list)
{
counting++;
array[i] = obj.percent;
i++;
if (obj.percent != "")
{
int count = Convert.ToInt32((double)T_clients * (Convert.ToDouble(obj.percent) / 100));
var selected_list = db.Clients.ToList().Take(count);
var query = from cust in selected_list
where cust.Salesperson_ID == T_ID
select cust;
foreach (Client cust in query)
{
int int_id = Convert.ToInt32(obj.ID);
cust.Salesperson_ID = int_id;
db.SaveChanges();
}
//db.SaveChanges();
//return View();
}
}
ViewBag.counting = counting;
ViewBag.percentages = array;
ViewBag.counter = counter;
db.SaveChanges();
return View();
}
答案 0 :(得分:0)
通过实际获取您想要的内容而不是通用的json和字符串然后转换它们来简化您的API。
像这样:
public ActionResult Submit(List<emp_info> list, int terminated_id)
{
// Grab records to update in one call
var clients=db.Clients.Where(c=>c.Salesperson_ID==terminated_id).ToList();
var total=clients.Count();
if (clients.Sum(c=>c.percent)!=100)
throw new ApplicationException("Percentages must add up to 100%!");
// Create new array with upperbound percent
var newlist=list
.Aggregate(new {ID=0,percent=0},(prev,curr)=>new {
ID=curr.ID,percent=prev.percent+curr.percent
});
// Sanity check
Debug.Assert(newlist.Last().percent==100);
// Loop through records and assign new salesperson
for(var x=0;x<total;x++)
{
clients[x].Salesperson_ID=newlist.Last(l=>l.percent<=x*100/total).ID;
}
// Send updates to database
db.SaveChanges();
ViewBag.counting = total;
ViewBag.percentages = list.Select(l=>l.percent).ToArray();
ViewBag.counter = total;
return View();
}
答案 1 :(得分:0)
您始终使用此db.Clients.ToList().Take(count);
计算首次计算客户
试试var selected_list = db.Clients.ToList().Skip((counting-1) * count).Take(count);
(count-1)从0开始,所以在开始时不会有任何跳过客户端,对于下一个员工,你将跳过前5个客户端(在你的情况下)。代码未经过测试,但试一试。我想发表评论,但我没有足够的代表:)