Можно ли использовать условие If Else в запросе LINQ?
Что-то вроде
from p in db.products
if p.price>0
select new
{
Owner=from q in db.Users
select q.Name
}
else
select new
{
Owner = from r in db.ExternalUsers
select r.Name
}





Я предполагаю из db, что это LINQ-to-SQL / Entity Framework / аналогичный (не LINQ-to-Objects);
Как правило, вы лучше справляетесь с условным синтаксисом (a? B: c) - однако я не знаю, будет ли он работать с вашими различными подобными запросами (в конце концов, как бы вы написали TSQL?).
В качестве тривиального примера того, что вы делаете может:
select new {p.PriceID, Type = p.Price > 0 ? "debit" : "credit" };
Вы можете делать гораздо более богатые вещи, но я действительно сомневаюсь, что вы сможете выбрать Таблица в условном выражении. Конечно, можете попробовать ...
Это может сработать ...
from p in db.products
select new
{
Owner = (p.price > 0 ?
from q in db.Users select q.Name :
from r in db.ExternalUsers select r.Name)
}
Это должно сработать. «?:» Переводится в выражение «case», и есть подзапросы.
Не должно быть. Было бы неплохо получить подтверждение того, что это действительно работает. Очень полезно, если это так.
@Richard, если мне нужно вызвать функцию по условию else, возможно ли это?
@NithinPaul - вероятно, лучше всего, если вы разместите новый вопрос, точно объясняя, что вы пытаетесь сделать.
@ Ричард Эверетт, я так не думаю, Ричард, просто нужно знать. В вашем ответе, не используя эту строку «from r в db.ExternalUsers select r.Name)» в условии else, могу ли я использовать вызов функции для возврата желаемого текста ?. Думаю, LInq этого не допустит, да?
Возможно ли таким образом иметь несколько условий «если»?
Ответ выше не подходит для усложнения выражения Linq. Все что тебе нужно это:
// set up the "main query"
var test = from p in _db.test select _db.test;
// if str1 is not null, add a where-condition
if (str1 != null)
{
test = test.Where(p => p.test == str);
}
вы должны изменить вот так:
private string getValue(float price)
{
if (price >0)
return "debit";
return "credit";
}
//Get value like this
select new {p.PriceID, Type = getValue(p.Price)};
мой пример:
companyNamesFirst = this.model.CustomerDisplayList.Where(a => a.CompanyFirst != null ? a.CompanyFirst.StartsWith(typedChars.ToLower())) : false).Select(b => b.CompanyFirst).Distinct().ToList();
var result = _context.Employees
.Where(x => !x.IsDeleted)
.Where(x => x.ClientId > (clientId > 0 ? clientId - 1 : -1))
.Where(x => x.ClientId < (clientId > 0 ? clientId + 1 : 1000))
.Where(x => x.ContractorFlag == employeeFlag);
return result;
Если clientId = 0, нам нужны ВСЕ сотрудники. но для любого clientId от 1 до 999 нам нужны только клиенты с этим идентификатором. У меня были проблемы с отдельными операторами LINQ, которые не были одинаковыми (фильтры Deleted / Clients должны быть для всех запросов), поэтому, добавив эти две строки, он работает (все будет так, пока у нас не будет 999+ клиентов - что было бы счастливым повторением -факторный день !!
Будет интересно посмотреть, сработает ли это ... если это так, я бы хотел увидеть TSQL (при условии, что он выполняет активную загрузку; для ленивой загрузки, вероятно, не так уж и страшно).