Ответ 1
Это может сработать...
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)
}
Можно ли использовать 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
}
Это может сработать...
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)
}
Я полагаю из db
, что это LINQ-to-SQL/Entity Framework/подобный (не LINQ-to-Objects);
Как правило, вам лучше работать с условным синтаксисом (a? b: c) - однако я не знаю, будет ли он работать с вашими различными запросами (в конце концов, как бы вы пишете TSQL?).
Для тривиального примера того типа вещей, который вы можете сделать:
select new {p.PriceID, Type = p.Price > 0 ? "debit" : "credit" };
Вы можете делать гораздо более богатые вещи, но я действительно сомневаюсь, что вы можете выбрать таблицу в условном выражении. Конечно, вы можете попробовать...
Ответ выше не подходит для усложнения выражения 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+ - что было бы хорошо рефакторинг день !!