我做了一个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
};
}
Run Code Online (Sandbox Code Playgroud)
它返回多行,每一段在飞行中= /
例:
航班列表包括:段1,段2
Segment1列表有:出发,到达Segment2列表有:出发,到达
代替:
出发时间:2.9.2013 4:50:51,抵达时间:2.9.2013 7:50:51;
出发时间:2.9.2013 5:50:51,抵达时间:2.9.2013 7:50:51; 出发日期:2.9.2013 8:50:51,抵达时间:2.9.2013 10:50:51;
我明白了:
出发时间:2.9.2013 4:50:51,抵达时间:2.9.2013 6:50:51;
出发时间:2.9.2013 5:50:51,抵达时间:2.9.2013 7:50:51; 出发日期:2.9.2013 8:50:51,抵达时间:2.9.2013 10:50:51;
出发时间:2.9.2013 5:50:51,抵达时间:2.9.2013 7:50:51; 出发日期:2.9.2013 8:50:51,抵达时间:2.9.2013 10:50:51;
这意味着,如果飞行中有超过1个段,我会获得双重记录.任何意见,将不胜感激.
它返回多行,每一段在飞行中= /
是的,那是因为你有效地进行了交叉连接,这里:
from flight in flights
from segments in flight.Segments
Run Code Online (Sandbox Code Playgroud)
我怀疑你想要更像这样的东西:
from flight in flights
where flight.Segments.Any(seg => seg.DepartureDate > DateTime.Now)
select new Flight { Segments = flight.Segments };
Run Code Online (Sandbox Code Playgroud)
或者,如果您只想包含未来的细分:
from flight in flights
let futureSegments = flight.Segments
.Where(seg => seg.DepartureDate > DateTime.Now)
.ToList()
where futureSegments.Any()
select new Flight { Segments = futureSegments };
Run Code Online (Sandbox Code Playgroud)
请注意,该ToList()呼叫确保flight.Segments每次航班仅评估一次.第一个查询可能会做同样的事情,尽管它不那么重要,除非flight.Segments 真的不能多次评估.
另外,在使用时要非常小心DateTime.Now,因为这总是在当地时间 - 这与自然跨越时区边界的航班特别相关; 我建议尽可能保留UTC中的所有内容.