C# Code/Expression 查找某个值落在哪个范围内 --
C# Code/Expression to find which range a certain value falls within --
我会简单解释一下我有什么。
我有一个这样的配置数据列表 --
现在我正在尝试编写代码,根据某个用户的购买销售额找出 set/config 属于哪个用户。例如。如果他的销售额达到 23000 美元,他就会成为 G01 级销售员。如果他赚了 51000 美元,他就是 G04 级。如果他卖出 29000 美元,他就是 G02 级。或者,如果他制造了 71000,他显然是 G05 等级。像那样。解释我的用例。
我写的code/logic是这样的-
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 以及我只是从存储 table 的数据库中获取和填充的所有内容。显然 'CustomerGrade' 的逻辑是错误的。因为它给了我各种乱七八糟的结果。对于 33000 美元的销售,它提供 G01,对于 61000 美元的销售,它提供 G04 和类似的其他各种错误输出。我尝试使用 lambda 聚合。不过好像不对。
你能帮我完善这个逻辑吗?这种情况的防弹逻辑?这对我有很大帮助!
感谢大家,
这是我的真实数据集--
假设 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.
Sorts the elements of a sequence in ascending order.
更新
_appDbContext.OrderBy(x => x.MinSaleAmount)
.LastOrDefault(x => x.MinSaleAmount < salesTot);
好的,这是在说什么
按照您 table 中的销售额订购。过滤掉超过该销售额的所有内容,然后选择最后一个。
如果 salesTot
高于列表中的最后一项,它将 return 列表中的最后一项。如果它小于最小值,它将 return null。
这里的混淆基本上是概念,如果最低销售额,作为 G02 他们不能低于 25000,或者他们是 G01。但是没有上限。虽然有一个有限的下限
我会简单解释一下我有什么。
我有一个这样的配置数据列表 --
现在我正在尝试编写代码,根据某个用户的购买销售额找出 set/config 属于哪个用户。例如。如果他的销售额达到 23000 美元,他就会成为 G01 级销售员。如果他赚了 51000 美元,他就是 G04 级。如果他卖出 29000 美元,他就是 G02 级。或者,如果他制造了 71000,他显然是 G05 等级。像那样。解释我的用例。
我写的code/logic是这样的-
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 以及我只是从存储 table 的数据库中获取和填充的所有内容。显然 'CustomerGrade' 的逻辑是错误的。因为它给了我各种乱七八糟的结果。对于 33000 美元的销售,它提供 G01,对于 61000 美元的销售,它提供 G04 和类似的其他各种错误输出。我尝试使用 lambda 聚合。不过好像不对。
你能帮我完善这个逻辑吗?这种情况的防弹逻辑?这对我有很大帮助! 感谢大家,
这是我的真实数据集--
假设 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.
Sorts the elements of a sequence in ascending order.
更新
_appDbContext.OrderBy(x => x.MinSaleAmount)
.LastOrDefault(x => x.MinSaleAmount < salesTot);
好的,这是在说什么
按照您 table 中的销售额订购。过滤掉超过该销售额的所有内容,然后选择最后一个。
如果 salesTot
高于列表中的最后一项,它将 return 列表中的最后一项。如果它小于最小值,它将 return null。
这里的混淆基本上是概念,如果最低销售额,作为 G02 他们不能低于 25000,或者他们是 G01。但是没有上限。虽然有一个有限的下限