C # Code / Expression, чтобы найти диапазон, в который попадает определенное значение - - PullRequest
0 голосов
/ 02 сентября 2018

Я просто вкратце объясню, что у меня есть.

У меня есть список данных конфигурации, как это - 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 и аналогичные другие всевозможные ошибочные результаты. Я пытался использовать лямбда-агрегат. Но, похоже, это неверно.

Можете ли вы помочь мне усовершенствовать эту логику, пожалуйста? Пуленепробиваемая логика для этого сценария? Это было бы очень полезно для меня! Спасибо всем,

Это мой фактический набор данных -

enter image description here

1 Ответ

0 голосов
/ 02 сентября 2018

Предполагая, что 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 выше, чем последний элемент в списке, он вернет последний элемент в списке. если он меньше минимального значения, он возвращает ноль.

Путаница здесь заключалась в основном в том, что если минимальный объем продаж, то есть G02, они не могут составить менее 25000, или это G01. Однако верхнего предела нет. Хотя есть конечный нижний предел

...