Is there any way to simplify this linq

I have two bool flags and you need to filter my collection accordingly. There should be a cleaner way to do this. If someone can point me in the right direction, I would appreciate it. Thanks.

var _filteredEvents = from ev in _events select ev; if (!queueEmail) // don't queue email { if (!queueTextMessaging) // don't queue textmessaging { _filteredEvents = from ev in _events where ev.QueueTypeEnumText != QueueType.TextMessage.ToString() && ev.QueueTypeEnumText !=QueueType.Email.ToString() select ev; } else { _filteredEvents = from ev in _events where ev.QueueTypeEnumText != QueueType.Email.ToString() select ev; } } else //queue email { if (!queueTextMessaging) //don't queue textmessaging { _filteredEvents = from ev in _events where ev.QueueTypeEnumText != QueueType.TextMessage.ToString() select ev; } } 
+8
c # linq
source share
4 answers

Since LINQ uses deferred execution, you can simply change the Where() extensions to your object and reassign it as you go:

 var _filteredEvents = _events; if (!queueEmail) _filteredEvents = _filteredEvents.Where(ev => ev.QueueTypeEnumText != QueueType.Email.ToString()); if (!queueTextMessaging) _filteredEvents = _filteredEvents.Where(ev => ev.QueueTypeEnumText != QueueType.TextMessage.ToString()); 
+9
source share

You can make one where clause:

 where (queueTextMessaging || ev.QueueTypeEnumText != QueueType.TextMessage.ToString()) &&(queueEmail || ev.QueueTypeEnumText !=QueueType.Email.ToString()) 
+2
source share
 var _filteredEvents = from ev in _events where ( queueTextMessaging || ev.QueueTypeEnumText != QueueType.TextMessage.ToString() && queueEmail || ev.QueueTypeEnumText !=QueueType.Email.ToString()) select ev; 
+2
source share

I would just create a method that checks the condition for you

var _filteredEvents = from ev in _events where Test(queueEmail, queueTextMessaging, ev) select ev;

...

bool Test(bool foo, bool bar, Event ev) {...}

0
source share

All Articles