Если еще в 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
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
40
0
137 724
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я предполагаю из 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)
    }

Будет интересно посмотреть, сработает ли это ... если это так, я бы хотел увидеть TSQL (при условии, что он выполняет активную загрузку; для ленивой загрузки, вероятно, не так уж и страшно).

Marc Gravell 14.01.2009 17:12

Это должно сработать. «?:» Переводится в выражение «case», и есть подзапросы.

Amy B 14.01.2009 17:28

Не должно быть. Было бы неплохо получить подтверждение того, что это действительно работает. Очень полезно, если это так.

Sam Meldrum 14.01.2009 18:02

@Richard, если мне нужно вызвать функцию по условию else, возможно ли это?

Nithin Paul 26.02.2015 16:01

@NithinPaul - вероятно, лучше всего, если вы разместите новый вопрос, точно объясняя, что вы пытаетесь сделать.

Richard Ev 26.02.2015 16:35

@ Ричард Эверетт, я так не думаю, Ричард, просто нужно знать. В вашем ответе, не используя эту строку «from r в db.ExternalUsers select r.Name)» в условии else, могу ли я использовать вызов функции для возврата желаемого текста ?. Думаю, LInq этого не допустит, да?

Nithin Paul 27.02.2015 08:09

Возможно ли таким образом иметь несколько условий «если»?

Tadej 25.05.2018 13:51

Ответ выше не подходит для усложнения выражения 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+ клиентов - что было бы счастливым повторением -факторный день !!

Другие вопросы по теме