我做了一个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个段,我会获得双重记录。 任何建议将不胜感激。
答案 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;