2017-01-16 7 views
0

I 현재 다음과 같은 방법이 있습니다된 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; 
    } 

, (I 시도했듯이)이며, 전화를 만드는 paramters 일치하는 모든 Order_Travel 개체를 발견하기를 그것을 보냈습니다. 일부 (또는 모두)를 비워두면 값에 관계없이 모든 것을 취합니다. 빈 검색 (매개 변수가없는 검색)이 있으면이 코드는 현재 아무 것도 반환하지 않으며 문제가 무엇인지 알 수 없습니다. 디버깅을 시도했지만 운이 없었습니다.

도움이 될 것입니다.

감사합니다!

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

그것은 당신의 프로필 ID가 0이면, 그것은 단지 x.Profile.ProfileID0 인으로 항목을 찾을 수

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

을해야한다 :

답변

0

아마이 부분은 당신의 문제입니다. 아마도 그러한 항목이 없을 것입니다.

+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); 
} 

.