web-dev-qa-db-fra.com

Si autre dans LINQ

Est-il possible d'utiliser If Else conditionnel dans une requête LINQ?

Quelque chose comme

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
}
35
Graviton

Cela pourrait fonctionner ...

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)
    }
56
Richard Everett

Je suppose à partir de db qu'il s'agit de LINQ-to-SQL/Entity Framework/similaire (et non de LINQ-to-Objects);

En général, vous faites mieux avec la syntaxe conditionnelle (a? B: c). Cependant, je ne sais pas si cela fonctionnera avec vos différentes requêtes de la sorte (après tout, comment écririez-vous le TSQL?).

Pour un exemple trivial du type de chose que vous pouvez faire:

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

Vous pouvez faire des choses beaucoup plus riches, mais je doute fort que vous puissiez choisir le table dans le conditionnel. Vous pouvez essayer, bien sûr ...

8
Marc Gravell

La réponse ci-dessus ne convient pas à une expression compliquée de Linq . Tout ce dont vous avez besoin est:

// 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);
}
3
Cheung

vous devriez changer comme ceci:

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

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

mon exemple:

 companyNamesFirst = this.model.CustomerDisplayList.Where(a => a.CompanyFirst != null ? a.CompanyFirst.StartsWith(typedChars.ToLower())) : false).Select(b => b.CompanyFirst).Distinct().ToList();
1
Bianca Kalman
 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;

Si clientId = 0, nous voulons TOUS les employés. mais pour tout clientId compris entre 1 et 999, nous ne voulons que les clients ayant cet ID. Je rencontrais des problèmes avec des déclarations LINQ distinctes qui n'étaient pas identiques (les filtres Supprimé/Clients doivent figurer sur toutes les requêtes), donc en ajoutant ces deux lignes cela fonctionne -factor day !!

0
Tony Trembath-Drake