Подтвердить что ты не робот

Если Else в LINQ

Можно ли использовать 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
}
4b9b3361

Ответ 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)
    }

Ответ 2

Я полагаю из db, что это LINQ-to-SQL/Entity Framework/подобный (не LINQ-to-Objects);

Как правило, вам лучше работать с условным синтаксисом (a? b: c) - однако я не знаю, будет ли он работать с вашими различными запросами (в конце концов, как бы вы пишете TSQL?).

Для тривиального примера того типа вещей, который вы можете сделать:

select new {p.PriceID, Type = p.Price > 0 ? "debit" : "credit" };

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

Ответ 3

Ответ выше не подходит для усложнения выражения 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);
}

Ответ 4

вы должны изменить следующим образом:

private string getValue(float price)
{
    if(price >0)
        return "debit";
    return "credit";
}

//Get value like this
select new {p.PriceID, Type = getValue(p.Price)};

Ответ 5

мой пример:

 companyNamesFirst = this.model.CustomerDisplayList.Where(a => a.CompanyFirst != null ? a.CompanyFirst.StartsWith(typedChars.ToLower())) : false).Select(b => b.CompanyFirst).Distinct().ToList();

Ответ 6

 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+ - что было бы хорошо рефакторинг день !!