Linq/EF в ASP.NET Blazor

Linq/EF в ASP.NET Blazor

Я использую Блазор.

Я пытаюсь получить конкретный результат от dbset.

У меня два условия, зарплата 620 и вычет 2 р.

Сложность с диапазоном, кстати 600~700 за зарплату. Затем, как я перехожу к определенному столбцу, чтобы получить результат для p2.

var result = await _db.TaxTable.......бла...бла...

В этом случае я должен найти результат 70

Я пробовал какой-то код... но каждый раз терпел неудачу.

Не могли бы вы поделиться точным знанием?

Спасибо в рекламе.

.Where(x => x.start <= salary && x.end >= salary) ?
David 21.11.2022 13:27

«Я пробовал какой-то код... но каждый раз терпел неудачу»: пожалуйста, поделитесь соответствующим кодом, который вы пробовали, и опишите «неудачу».

T.Trassoudaine 21.11.2022 14:25

Я удалил тег Blazor.

Brian Parker 21.11.2022 19:44
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
3
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш запрос к вашему DbSet должен выглядеть примерно так, чтобы получить конкретное значение:

using var dbContext = _factory.CreateDbContext();
dbContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

var value = await dbContext.Set<TRecord>()
    .SingleOrDefault(item => item.start <= this.salary && item.end >= this.salary)?.p2 ?? 0;

Вот демонстрационная страница.

@page "/"

<PageTitle>Index</PageTitle>

<input class="form-control" @bind-value=this.salary />

<div class="text-end m-2">
    <button class="btn btn-primary" @onclick=Calc>Calculate</button>
    <button class="btn btn-secondary" @onclick=Calc2>Calculate 2</button>
</div>

<div class="bg-dark text-white m-2 p-2">
    P2 = @P2
</div>

@code {
    private int salary;
    private int P2;

    private void Calc()
    {
        var record = deductions.SingleOrDefault(item => item.start <= this.salary && item.end >= this.salary);
        P2 = record?.p2 ?? 0;
    }

    private void Calc2()
    {
        P2 = deductions.SingleOrDefault(item => item.start <= this.salary && item.end >= this.salary)?.p2 ?? 0;
    }


    private List<Deduction> deductions = new List<Deduction>
    {
      new Deduction(1,0,199,10,20,30),   
      new Deduction(2,200,299,20,30,40),
      new Deduction(3,300,399,30,40,50),
      new Deduction(4,400,499,40,50,60),
    };

    public record Deduction(int Id, int start, int end, int p1, int p2, int p3 );
}

Примечание: в вашем наборе данных есть проблема, ваши диапазоны перекрываются!

эта часть выглядит чем-то новым для меня. 'item => x => x.start...' Могу я спросить, какая разница между 'item => x => x.start' и просто 'x => x.start'?

sayditto 21.11.2022 16:59

Больше всего я не знал части 'select(item => item.p2)'. спасибо, мистер, я попробую это.

sayditto 21.11.2022 17:01

Более того, вы будете генерировать исключение (в большинстве случаев), если зарплата точно равна x.start или x.end.

T.Trassoudaine 21.11.2022 17:36

Я скопировал неправильный текст! Вот пересмотренный ответ.

MrC aka Shaun Curtis 21.11.2022 19:29

Лучше всего, если они перекрываются, как опубликовал ОП, и используют >= или <= с одной стороны и < или > с другой соответственно. Таким образом, нет пробелов. Я делал такие таблицы много раз, прежде чем включать результаты лабораторных исследований, которые могут иметь очень хорошее разрешение.

Brian Parker 21.11.2022 19:41

@BrianParker - я обдумывал это сегодня вечером (Великобритания) и могу придумать аргументы в пользу того, чтобы сделать это в любом случае, но в целом я согласен с вами. В любом случае, выбор ОП, он знает контекст и знает, как это сделать сейчас!

MrC aka Shaun Curtis 21.11.2022 23:32

Вы должны найти строку. Затем используйте оператор switch, чтобы получить соответствующее значение.

double GetDeduction(double salary, string discount)
{
    var row = someData.SingleOrDefault(a => salary >= a.start && salary < a.end);

    if(row == null) throw new SomeRowNotFoundException();

    return discount switch 
    {
        "p1" => row.p1,
        "p2" => row.p2,
        "p3" => row.p3,
        _ => throw new SomeDiscountNotValidException();
    }
}

Вы должны включить одну из границ и исключить другую, чтобы избежать наложения. Я произвольно решил включить начало, альтернативой было бы

someData.SingleOrDefault(a => salary > a.start && salary <= a.end)

Да, вы точно указали на это (проблему перекрытия), когда я рисовал изображение. Спасибо. И это был отличный совет для меня использовать оператор switch. Я выучил.

sayditto 21.11.2022 21:28

Другие вопросы по теме