C#代码/表达式以查找某个值在-

时间:2018-09-02 10:01:17

标签: c# lambda aggregate-functions boolean-expression

我将简单解释一下我拥有的东西。

我有一个这样的配置数据列表- enter image description here

现在,我正在尝试编写代码,以根据某位用户的购买销售额来确定该用户属于哪个设置/配置。例如如果他的销售额达到23000美元,那么他将成为G01级销售人员。如果他赚了51000美元,他就是G04级。如果他卖29000美元,他将是G02等级。或者,如果他的成绩是71000,那么他显然是G05级。像那样。解释我的用例。

我编写的代码/逻辑类似于-

public JsonResult CustomerGradeByID([FromBody]decimal saleAmt)
{
    try
    {
        var cGrade = CustomerGrade(Convert.ToDecimal(saleAmt));
        return Json(cGrade);
    }
    catch (Exception exp)
    {
        return Json(exp.GetBaseException());
    }
}
protected string CustomerGrade(decimal salesTot)
{
    try
    {
        var grades = _appDbContext.CustomerGrades.ToList();
        CustomerGrade cg = grades.Aggregate((a, b) => a.grade_minsaleamount < salesTot && salesTot < b.grade_minsaleamount ? a : b);
        var gdName = cg.grade_name.ToString();
        return gdName;
    }
    catch(Exception exp)
    {
        throw exp;
    }
}

不用担心_appdbcontext以及我只是从存储该表的数据库中获取和填充的所有内容。显然,“ CustomerGrade”的逻辑是错误的。因为它给了我各种各样的结果。对于33000美元的销售,它给出G01,对于61000美元的它给出G04和类似的所有其他错误输出。我尝试使用lambda聚合。但这似乎是不正确的。

您能帮我完善这种逻辑吗?这种情况下的防弹逻辑?这对我有很大帮助! 谢谢大家,

这是我的实际数据集-

enter image description here

1 个答案:

答案 0 :(得分:4)

假设grade_minsaleamount是唯一的,您可以排序列表并使用FirstOrDefault,我想,这一切都可以在数据库上完成

var result = _appDbContext.CustomerGrades
                          .OrderBy(x => x.grade_minsaleamount)
                          .FirstOrDefault(x => salesTot >= x.grade_minsaleamount);

// Sanity check for null
if(result != null)
{
   // found!
   Debug.WriteLine(result.Name);
}

其他资源

Enumerable.FirstOrDefault Method

  

返回序列的第一个元素,如果没有则返回默认值   找到元素。

Enumerable.OrderBy Method

  

按升序对序列的元素进行排序。

更新

_appDbContext.OrderBy(x => x.MinSaleAmount)
                      .LastOrDefault(x => x.MinSaleAmount < salesTot);

好吧,这是什么意思

像表中一样订购销售额。过滤掉超出该销售额的任何东西,然后选择最后一个。

如果salesTot高于列表中的最后一项,它将返回列表中的最后一项。如果小于最小值,则返回null。

这里的困惑基本上是以下概念:最小销售量,即G02,他们的收入不能少于25000,或者是G01。但是没有上限。尽管下限是有限的