Linq返回多列

时间:2013-08-30 15:53:47

标签: 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
            };
    }

它会返回多行,每行中的每一行= /

示例:

航班列表有:  第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个段,我会获得双重记录。 任何建议将不胜感激。

2 个答案:

答案 0 :(得分: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 };

或者,如果您只想包含未来的细分:

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

答案 1 :(得分:1)

嗯,这是因为你正在迭代过滤器中的每个子段,这将导致连接,这可能是记录来自的地方。

您想要的查询是我相信的

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