Я использую Блазор.
Я пытаюсь получить конкретный результат от dbset.
У меня два условия, зарплата 620 и вычет 2 р.
Сложность с диапазоном, кстати 600~700 за зарплату. Затем, как я перехожу к определенному столбцу, чтобы получить результат для p2.
var result = await _db.TaxTable.......бла...бла...
В этом случае я должен найти результат 70
Я пробовал какой-то код... но каждый раз терпел неудачу.
Не могли бы вы поделиться точным знанием?
Спасибо в рекламе.
«Я пробовал какой-то код... но каждый раз терпел неудачу»: пожалуйста, поделитесь соответствующим кодом, который вы пробовали, и опишите «неудачу».
Я удалил тег Blazor.
Ваш запрос к вашему 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'?
Больше всего я не знал части 'select(item => item.p2)'. спасибо, мистер, я попробую это.
Более того, вы будете генерировать исключение (в большинстве случаев), если зарплата точно равна x.start
или x.end
.
Я скопировал неправильный текст! Вот пересмотренный ответ.
Лучше всего, если они перекрываются, как опубликовал ОП, и используют >=
или <=
с одной стороны и <
или >
с другой соответственно. Таким образом, нет пробелов. Я делал такие таблицы много раз, прежде чем включать результаты лабораторных исследований, которые могут иметь очень хорошее разрешение.
@BrianParker - я обдумывал это сегодня вечером (Великобритания) и могу придумать аргументы в пользу того, чтобы сделать это в любом случае, но в целом я согласен с вами. В любом случае, выбор ОП, он знает контекст и знает, как это сделать сейчас!
Вы должны найти строку. Затем используйте оператор 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. Я выучил.
.Where(x => x.start <= salary && x.end >= salary)
?