Linq返回多列

ame*_*els -1 c# 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
            };
    }
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个段,我会获得双重记录.任何意见,将不胜感激.

Jon*_*eet 6

它返回多行,每一段在飞行中= /

是的,那是因为你有效地进行了交叉连接,这里:

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中的所有内容.