Is there a way to simplify this linq
I have 2 bool flags and need to filter my collection accordingly. There has to be an cleaner way to do this. If anyone can point me in the right direction I'd 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开发者_StackOverflow.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;
    }
}
Since LINQ uses deferred execution, you can just change the Where() extensions onto 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());
You can make one where clause:
where 
     (queueTextMessaging || ev.QueueTypeEnumText != QueueType.TextMessage.ToString())
   &&(queueEmail || ev.QueueTypeEnumText !=QueueType.Email.ToString())
var _filteredEvents =
  from ev in _events where (
    queueTextMessaging || ev.QueueTypeEnumText != QueueType.TextMessage.ToString() &&
    queueEmail || ev.QueueTypeEnumText !=QueueType.Email.ToString())
  select ev;
I would simply create a Method testing 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) {...}
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论