2012-12-14 43 views
2

我有我試圖重構,因爲它不太好一些LINQ代碼:C#LINQ當條件如果

基本上,我想知道是否有執行以下一個更好的辦法:

if (!string.IsNullOrWhiteSpace(_filter.AssignedTo) 
{ 
var query = from ticket in dataClassesDataContext.TicketsIssues 
      where ticket.ClosedDate == null 
      && cUser.GetUserNameUsingGUID(ticket.AssignTicketToUser) == _filter.AssignedTo             
      select new 
      { 
       Priority = ticket.TicketPriority.TicketPriorityName, 
       Description = ticket.Description.Replace("\n", ", "), 
      }; 
} 
else 
{ 
var query = from ticket in dataClassesDataContext.TicketsIssues 
      where ticket.ClosedDate == null 
      select new 
      { 
       Priority = ticket.TicketPriority.TicketPriorityName, 
       Description = ticket.Description.Replace("\n", ", "), 
      }; 
} 

它們都是相同遠離where子句是用於AssignTicketToUser檢查。

我希望有更好的方法來避免使用if else語句嗎?我有一些這樣的代碼塊,不想重複代碼!

回答

8
var query = from ticket in dataClassesDataContext.TicketsIssues 
      where ticket.ClosedDate == null 
      && (string.IsNullOrWhiteSpace(_filter.AssignedTo) ? true : cUser.GetUserNameUsingGUID(ticket.AssignTicketToUser) == _filter.AssignedTo)             
      select new 
      { 
       Priority = ticket.TicketPriority.TicketPriorityName, 
       Description = ticket.Description.Replace("\n", ", "), 
      }; 

你可以擺脫if-else語句的乾脆。將if條件轉移到2nd where子句,並刪除!那第二個條款成爲三元運算符。

如果條件爲真,即如果_filter.AssignedTo爲null,則不要通過返回true來測試_filter.AssignedTo。如果它不爲空或空,則繼續處理原始else塊中的子句。

+5

而不是'condition1? true:condition2'你可以寫'(condition1 || condition2)'。 –

+0

謝謝,這正是我正在尋找....並感到尷尬,我沒有想到這個自己(一個新的嬰兒和深夜工作的組合!)。謝謝 – Belliez

3

一種方式可以是:

var query = from ticket in dataClassesDataContext.TicketsIssues 
      where ticket.ClosedDate == null 
      select new 
      { 
       Priority = ticket.TicketPriority.TicketPriorityName, 
       Description = ticket.Description.Replace("\n", ", "), 
      }; 

if (!string.IsNullOrWhiteSpace(_filter.AssignedTo) 
    query = query.Where(w => cUser.GetUserNameUsingGUID(w.AssignTicketToUser) == _filter.AssignedTo)); 
1

看看PredicateBuilderimplementation from C# In a NutshellAnd方法應該以更通用的方式解決您的問題,並幫助理解LINQ和表達式樹。你會最終得到類似的東西:

var query = from ticket in dataClassesDataContext.TicketsIssues 
      where ticket.ClosedDate == null 
      select new 
      { 
       Priority = ticket.TicketPriority.TicketPriorityName, 
       Description = ticket.Description.Replace("\n", ", "), 
      }; 

if (!string.IsNullOrWhiteSpace(_filter.AssignedTo)) 
{ 
    query = query.And(ticket => cUser.GetUserNameUsingGUID(ticket.AssignTicketToUser) == _filter.AssignedTo); 
}