2013-08-30 49 views
-1

我做測試用LINQ,沒有什麼特別的:LINQ的返回多列

 public IEnumerable<Flight> GetActiveFlights(IEnumerable<Flight> flights) 
    { 
     return from flight in flights 
      from segments in flight.Segments 
      where segments.DepartureDate > DateTime.Now 
      select new Flight 
      { 
       Segments = flight.Segments 
      }; 
    } 

並返回多排,每排在飛行=/

實施例的各段:

航班列表有: 段1,段2

段1列表有:出發,到達 段2列表有:出發,到達

代替:

出發:2013年9月2日四點50分51秒,到達:2013年2月9日7點50分51秒;

出發:2013年2月9日5點50分51秒,到達:2013年2月9日7點50分五十一秒;出發日期:2.9.2013 8:50:51,抵達日期:2.9.2013 10:50:51;

我得到:

出發日期:2013年9月2日四時50分51秒,到達:2013年9月2日六時50分51秒;

出發:2013年2月9日5點50分51秒,到達:2013年2月9日7點50分五十一秒;出發日期:2.9.2013 8:50:51,抵達日期:2.9.2013 10:50:51;

出發:2013年2月9日5點50分51秒,到達:2013年2月9日7點50分五十一秒;出發:2013年2月9日8:50:51,到達:2013年2月9日10點50分51秒;

這意味着,我得到雙倍的記錄,如果有超過1段飛行。 任何意見,將不勝感激。

回答

6

並返回多行,每行對每個飛行段=/

是的,那是因爲你已經有了一個交叉聯接有效,在這裏:

from flight in flights 
from segments in flight.Segments 

我懷疑你想要更像這樣的東西:

from flight in flights 
where flight.Segments.Any(seg => seg.DepartureDate > DateTime.Now) 
select new Flight { Segments = flight.Segments }; 

或者如果你只想包括f uture段:

from flight in flights 
let futureSegments = flight.Segments 
          .Where(seg => seg.DepartureDate > DateTime.Now) 
          .ToList() 
where futureSegments.Any() 
select new Flight { Segments = futureSegments }; 

注意,ToList()通話將確保flight.Segments只是每次飛行評估一次。同樣有可能被做了第一次查詢,雖然它不那麼重要了,除非有flight.Segments真的不能超過一次評​​估。另外,請謹慎使用DateTime.Now,因爲這總是在當地時間 - 這是特別是與自然跨越時區邊界的航班相關;我建議儘可能使用UTC保存所有內容。

+0

這些查詢都涉及迭代'flights' N次,這可能是一個問題。最後一個查詢也迭代'futureSegments'多次,這意味着多次進行過濾。根據'flights'的底層實現以及具體的數據,這可能會很好,但它可能非常高效,甚至可能無法正常工作。 – Servy

+0

@Servy:將添加'ToList()'到第二個... –

+0

再次很好的解釋。你真的努力爲人們解釋理解。 關於未來的細分市場,這是什麼意思?像段2,段3,沒有段1? –

1

嗯,這是因爲你正在迭代過濾器中的每個子段,這將導致聯接,這可能是記錄來自何處。

你想要的查詢是這樣的,我相信

return from flight in flights 
     where flight.Segments.Any(x => x.DepartureDate > DateTime.Now) 
     select flight;