2017-01-16 24 views
0

目前,我有以下方法:IQueryable的只有可選參數

 public List<Order> GetOrders(int profileId, string timeSpan, string workOrd, string partNo, bool includeDeleted) 
    { 
     DateTime startDate = DateTime.Now; 
     DateTime endDate = DateTime.Now; 
     string[] times = (!string.IsNullOrWhiteSpace(timeSpan)) ? timeSpan.Trim().Split('-') : new string[] { "", "" }; 
     if (!string.IsNullOrWhiteSpace(times[0]) && !string.IsNullOrWhiteSpace(times[0])) 
     { 
      startDate = DateTime.Parse(times[0]).Date; 
      endDate = DateTime.Parse(times[1]).Date; 
     } 

     //New Real Query 
     IQueryable<Order_Travel> otQuery = _context.Order_Travels.Where(x => 
      (profileId != 0 || x.Profile.ProfileID == profileId) 
      && ((timeSpan == null || timeSpan.Trim() == "") || ((DbFunctions.TruncateTime(x.TimeRecieved) >= startDate) 
                  && (DbFunctions.TruncateTime(x.TimeRecieved) <= endDate))) 
      && ((workOrd == null || workOrd.Trim() == "") || x.Order.WorkOrdNo == workOrd) 
      && ((partNo == null ||partNo.Trim() == "") || x.Order.PartNo == partNo) 
      && (!includeDeleted || x.Aborted == true)); 

     //The results is now in order_travel. Under here binding them to a list of orders with only the respective orderTravels included. 
     List<Order> orders = new List<Order>(); 
     List<Order_Travel> ots = otQuery.ToList(); 
     foreach (Order_Travel ot in ots) 
     { 
      var OrderInList = orders.FirstOrDefault(X => X == ot.Order); 
      if (OrderInList == null) 
      { 
       orders.Add(ot.Order); 
       OrderInList = orders.FirstOrDefault(X => X == ot.Order); 
       OrderInList.OrderTravels.Clear(); 
       OrderInList.OrderTravels.Add(ot); 
      } 
      else 
      { 
       OrderInList.OrderTravels.Add(ot); 
      } 
     } 
     return orders; 
    } 

我需要它做什麼,是(因爲我已經嘗試)撥打電話,找到匹配paramters所有Order_Travel對象發送給它。如果某些(或全部)空白,則無論值如何,都會佔用一切。 現在的代碼,如果進行空白搜索(沒有任何參數的搜索),則不會返回任何內容,並且我看不出有什麼問題。我試過調試它,但沒有運氣。

任何幫助將不勝感激!

謝謝!

回答

0

也許這部分是你的問題:

​​

應該

(profileId == 0 || x.Profile.ProfileID == profileId) 

如果您的配置文件ID爲0,它只能找到條目與x.Profile.ProfileID0。可能沒有這樣的條目。

+0

謝謝! 我一直在盯着自己,看着自己的代碼。這解決了我的問題。 –

+0

我剛剛做到了。謝謝! :) –

2

過濾一次一個選項,而不是試圖把一切都變成一個單一的表達,:

IQueryable<T> query = all; // start with everything 

if (IsPresent(option1)) 
{ 
    query = query.Where(t => t.XXX == option1); 
} 

IQueryable<Order_Travel> otQuery = _context.Order_Travels; 

if (profileId != 0) 
{ 
    otQuery = otQuery.Where(x => x.Profile.ProfileID == profileId); 
} 

if (timeSpan != null && timeSpan.Trim() != "") 
{ 
    otQuery = otQuery.Where(x => DbFunctions.TruncateTime(x.TimeRecieved) >= startDate && 
           DbFunctions.TruncateTime(x.TimeRecieved) <= endDate); 
} 

你還會發現這更容易維護比一個巨大的表達。