-1

我做了一个 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
            };
    }

它返回多行,每一行用于飞行中的每个段 =/

例子:

航班列表有:Segment 1、Segment2

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,我会获得双倍记录。任何意见,将不胜感激。

4

2 回答 2

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 中。

于 2013-08-30T15:57:35.143 回答
1

嗯,这是因为您也在迭代过滤器中的每个子段,这将导致连接,这很可能是记录的来源。

你想要的查询是这个我相信

return from flight in flights
       where flight.Segments.Any(x => x.DepartureDate > DateTime.Now)
       select flight;
于 2013-08-30T15:58:16.397 回答