Member 13677936 Ответов: 2

Можно ли создать три условия в LINQ с тремя различными результатами?


Три или несколько условий в LINQ

Что я уже пробовал:

Ниже приведен мой LINQ:

return await _trialBalanceContext
	.Entries
	.Select(x => new
	{
		accountTitle = x.AccountTitle,
		debitAmount = x.DebitAmount,
		creditAmount = x.CreditAmount,
	})
	.ToListAsync();

И я хочу применить эти условия ниже в моем LINQ выше.

if (accountTitle == "Asset"){
 	debitAmount = debitAmount * 100
 	creditAmount = creditAmount * 100
 } else if (accountTitle == "Expense"){
 	debitAmount = debitAmount - creditAmount
 	creditAmount = creditAmount * debitAmount
 } else 
 {
 	debitAmount = creditAmount + 30
 	creditAmount = debitAmount + 50
 }

2 Ответов

Рейтинг:
2

OriginalGriff

Самый аккуратный способ-превратить их в функции:

public int GetDebit(MyClass x)
    {
    if (x.AccountTitle == "Asset") return x.DebitAmount * 100;
    else if (x.AccountTitle == "Expense") return x.DebitAmount - x.CreditAmount;
    return x.CreditAmount + 30;
    }
public int GetCredit(MyClass x)
    {
    if (x.AccountTitle == "Asset") return x.CreditAmount * 100;
    else if (x.AccountTitle == "Expense") return x.DebitAmount * x.CreditAmount;
    return x.DebitAmount + 50;
    }
Тогда просто используйте их:
....Select(x => new
            {
                accountTitle = x.AccountTitle,
                debitAmount = GetDebit(x),
                creditAmount = GetCredit(x)
            })....


Maciej Los

Другой вариант-использовать условный оператор [? :] ;) Смотрите мой ответ.
Кстати: 5ed!

OriginalGriff

Я думал об этом, но это даже наполовину не делает код linq грязным и трудным в обслуживании. Я предпочитаю перенести это в отдельную функцию и держать ее чище.

Maciej Los

Соглашаться. Это мой любимый метод тоже. Однако это не дисквалифицирует использование условного оператора ;)

Рейтинг:
1

Maciej Los

Вы пробовали использовать [? :] условный оператор?

return await _trialBalanceContext
.Entries
.Select(x => new
{
accountTitle = x.AccountTitle,
debitAmount = x.AccountTitle == "Asset" ?  x.DebitAmount * 100 : x.AccountTitle == "Expense" ? x.DebitAmount - x.CreditAmount : x.CreditAmount + 30,
creditAmount = x.AccountTitle == "Asset" ? x.CreditAmount * 100: x.AccountTitle == "Expense" ? x.DebitAmount * x.CreditAmount : x.DebitAmount + 50
})
.ToListAsync();


Больше: ?: Операторов (Справочник По C#) | Майкрософт Документы[^]


Member 13677936

Однако мой accountTitle не может ссылаться на столбец debitAmount и creditAmount. Есть ли какое-то решение?

Maciej Los

Омг! Пожалуйста, внимательно посмотрите на свой запрос linq. А теперь взгляните на мою. Как относятся к x.CreditAount и x.DebitAmount?
Примечание: Я не использую accountTitle, но x.AccountTitle.