With Linq, can I use a conditional statement inside of a Where
extension method?
9 Answers
var query = someList.Where(a => (someCondition)? a == "something" : true);
so, if 'someCondition' is false, 'Where' will be skipped.

- 1,092
- 9
- 12
-
8Analog (little shorter): `var query = someList.Where(a => !someCondition || a == "something");` – logical8 Jul 23 '18 at 12:03
Yes you can like:
var query = someList.Where(a => a == "something");
if (condition)
{
query = query.Where(b => b == "something else");
}
var result = query.ToList();
Because Where
is producing an IQueryable
, the execution is deferred until the ToList
in my example so you can chain Where
s together as much as you want and then just execute it after you have passed all your conditions.

- 47,246
- 16
- 124
- 162
-
Where is not producing IQueryable, it is producing IEnumerable. Wrong answer – Omer Apr 11 '17 at 10:20
-
2@OmerK Where does in-fact product IQueryable, if the object you are running the extension method on is also an IQueryable, if you run it on an IEnumerable, you will get an IEnumerable. – D Hansen Aug 19 '17 at 19:29
-
This is only viable if you don't need the element's value in the condition. – itmuckel Feb 24 '22 at 09:36
Make use of WhereIf
extenstion method avaialbe in linq
Example
if (SearchControlMain.PostingID.HasValue)
query = query.Where(q => q.PostingID == SearchControlMain.PostingID);
instead of above go for the below
query = query.WhereIf(SearchControlMain.CategoryID.HasValue, q => q.CategoryID == SearchControlMain.CategoryID);

- 1
- 1

- 175,020
- 35
- 237
- 263
Not sure if this is appropriate but it is quite useful, you can use ifs quite handily with conditional where clauses:
var r = (from p in productinfo.tblproduct
where p.Accountid == accountid
select p);
if (uuf1 != null)
r = r.Where(p => p.UnitUserField1 == uuf1);
if (uuf2!= null)
r = r.Where(p => p.UnitUserField2 == uuf2);
So the where clause will be amended according to what is in UUF1 or UUF2 i.e. you might have only UUF1 with info, in which case it will take that and ignore the UUF2 where clause, you might have both in which it will take both or you might not have anything in UUF1 or 2 and your where clause will just take the accountid as the where clause.

- 2,769
- 8
- 47
- 70
In my case there were two "conditional" where depending on search keys, so I did:
var query = db.Package.Include("SomeThing")
.Where(item => searchString1 == null || searchString1 == "" || item.Contains(searchString1))
.Where(item => searchString2 == null || searchString2 == "" || item.Contains(searchString2));
...

- 569
- 1
- 5
- 13
from item in items
where condition1
&& (condition2 ? true : condition3)
select item
This is how can you can do it with the noob Linq syntax.
This applies the condition3 only if condition2 is false.
If condition2 is true, you are essentially doing && true
which has no effect on the where clause.
So it is essentially doing this:
if(condition2)
{
from item in items
where condition1
select item
else
{
from item in items
where condition1
&& condition3
select item
}

- 8,700
- 20
- 73
- 153
I had a scenario like this where I had to check for null within the list itself. This is what I did.
items = from p in items
where p.property1 != null //Add other if conditions
select p;
// Use items the way you would use inside the if condition
But as Kelsey pointed out this would work too -
items = items.Where(a => a.property1 != null);

- 3,195
- 2
- 41
- 65
I'm not sure what the question is, but a possible answer could be:
Yes,
list.Where(item => { if (Foo(item)) return true; else return false; });
It would be a complicated way of saying something simple, though.

- 502
- 2
- 9
In my case, I wanted to keep the elements which met my criteria and log the ones that didn't without iterating multiple times.
var merchantsWithLocations = allMerchants.Where(m =>
{
if (m.Locations?.Any() != true)
{
_logger.Log("Merchant {merchantId} has no locations", m.Id);
return false;
}
return true;
};
Any time you want to do a side-effect per element (such as logging), breaking out the lambda into a statement body makes it easy to reason about.

- 1,660
- 1
- 29
- 53