C# 代码/表达式来查找某个值落在哪个范围内——

标签 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

最佳答案

假设 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

Returns the first element of a sequence, or a default value if no element is found.

Enumerable.OrderBy Method

Sorts the elements of a sequence in ascending order.

更新

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

好的,这是在说什么

按照表格中的销售额排序。过滤掉超过该销售额的所有内容,然后选择最后一个。

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

这里的混淆基本上是概念,如果最低销售额,作为 G02 他们不能低于 25000,或者他们是 G01。但是没有上限。虽然有一个有限的下限

关于C# 代码/表达式来查找某个值落在哪个范围内——,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52135879/

相关文章:

javascript - C# mvc - Controller 返回部分 View 或 json 数据

c# - 将第一个数字替换为一个字节中的第二个数字

mysql - SQL 仅选择列上具有最大值的行

sql - 从 sql 查询 postgres 9.4 创建嵌套的 json

javascript - jQuery 数据表 ASP.NET 问题

c# - 如何在 WCF 操作中创建异步/后台进程?

c++ - std::transform with lambda: 跳过一些项目

java - 如何在 jdbcTemplate.query 函数之外声明 lambda 表达式?

c# - 在联接的基本 LINQ 查询上使用 lambda 表达式

sql - 将 NULL 视为最大可能值