it-swarm.com.de

Wenn sonst in LINQ

Ist es möglich, If Else bedingt in einer LINQ-Abfrage zu verwenden?

So etwas wie

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

Das könnte funktionieren ...

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

Ich gehe von db aus, dass dies LINQ-to-SQL/Entity Framework/ähnlich ist (nicht LINQ-to-Objects);

Im Allgemeinen sind Sie mit der bedingten Syntax (a? B: c) besser. Ich weiß jedoch nicht, ob sie mit Ihren verschiedenen Abfragen funktionieren wird (wie würden Sie die TSQL schreiben?).

Für ein triviales Beispiel für die Art von Dingen, die Sie können tun:

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

Sie können viel reichere Dinge tun, aber ich bezweifle wirklich, dass Sie die Tabelle in der Bedingung auswählen können. Sie können es natürlich gerne probieren ...

8
Marc Gravell

Die Antwort oben ist nicht für komplizierte Linq-Ausdrücke geeignet. Alles, was Sie brauchen, ist:

// 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

sie sollten sich so ändern:

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

mein Beispiel:

 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;

Wenn clientId = 0 ist, möchten wir ALLE Mitarbeiter. Für jede clientId zwischen 1 und 999 wollen wir jedoch nur Clients mit dieser ID. Ich hatte Probleme mit separaten LINQ-Anweisungen, die nicht die gleichen waren (Filter für gelöschte/Clients müssen für alle Abfragen gelten). Wenn Sie also diese beiden Zeilen hinzufügen, funktioniert es (bis 999 Clients) -faktortag !!

0