Graviton
Graviton

Reputation: 83254

If Else in LINQ

Is it possible to use If Else conditional in a LINQ query?

Something like

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
}

Upvotes: 44

Views: 175149

Answers (7)

S M Abrar Jahin
S M Abrar Jahin

Reputation: 14578

If you are using LinQ with EF Core, an easy example can be this-

var orderedData = await _dbContext.ModelName
                    .OrderBy(c => c.Name.Length.Length > 4 ? c.Name:c.SuperTerm.Name.IndexOf(searchValue))
                    .ThenBy(t => t.Producer)
                    .TolistAsync();

Upvotes: 0

Tony Trembath-Drake
Tony Trembath-Drake

Reputation: 1678

 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;

If clientId = 0 we want ALL employees,. but for any clientId between 1 and 999 we want only clients with that ID. I was having issues with seperate LINQ statements not being the same (Deleted/Clients filters need to be on all queries), so by add these two lines it works (all be it until we have 999+ clients - which would be a happy re-factor day!!

Upvotes: 1

Bianca Kalman
Bianca Kalman

Reputation: 229

my example:

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

Upvotes: 0

Lucascio Phan
Lucascio Phan

Reputation: 9

you should change like this:

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

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

Upvotes: 0

Cheung
Cheung

Reputation: 15552

Answer above is not suitable for complicate Linq expression. All you need is:

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

Upvotes: 4

Richard Ev
Richard Ev

Reputation: 54087

This might work...

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)
    }

Upvotes: 65

Marc Gravell
Marc Gravell

Reputation: 1062550

I assume from db that this is LINQ-to-SQL / Entity Framework / similar (not LINQ-to-Objects);

Generally, you do better with the conditional syntax ( a ? b : c) - however, I don't know if it will work with your different queries like that (after all, how would your write the TSQL?).

For a trivial example of the type of thing you can do:

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

You can do much richer things, but I really doubt you can pick the table in the conditional. You're welcome to try, of course...

Upvotes: 11

Related Questions