我正在尝试转换这个确切的SQL查询,它将A和B之间的不同航线路径转换为LINQ查询:
SELECT F1.DepartingFromId, F1.ArrivingAtId
FROM dbo.Flights AS F1
WHERE F1.DepartingFromId = 1
GROUP BY F1.ArrivingAtId, F1.DepartingFromId
如果我在上面的SQL上使用foreach (airport in airports)
,它将为我提供一个不同路径的列表,例如,路径中只有A到B中的一个。
到目前为止,我有:
var dc = from flight in _DbContext.Flights
where flight.DepartingFromId == airport.Id
group flight by flight.ArrivingAtId
into flightGroup
select flightGroup;
foreach (var flightGroup in dc)
{
foreach (var flight in flightGroup)
{
distinctFlights.Add(new DistinctConnection(flight.DepartingFromId, flight.ArrivingAtId));
}
}
但是,这将返回数据库中的所有航班。这就像200,000行。应该有大约70个不同的联系。
我非常感谢任何帮助,因为我是LINQ / Lambda的新手。
答案 0 :(得分:1)
我不明白为什么这会返回所有航班,因为您正在过滤where
条件flight.DepartingFromId == airport.Id
。
要获得不同的选项,请选择
g.Key
)设为ArrivingAtId
DepartingFromId
子句中过滤的where
(即airport.Id
)像这样:
// Query for distinct connections from `airport.Id`.
var results =
from flight in _DbContext.Flights
where flight.DepartingFromId == airport.Id
group flight by flight.ArrivingAtId into g
select new DistinctConnection(airport.Id, g.Key);
// Add them to the list.
distinctFlights.AddRange(results);
答案 1 :(得分:1)
在我看来,这将是一个更清晰的方式 - 它避免了不必要的分组:
distinctFlights.AddRange(
(
from flight in _DbContext.Flights
where flight.DepartingFromId == airport.Id
select flight.ArrivingAtId
)
.Distinct()
.ToArray()
.Select(x => new DistinctConnection(airport.Id, x)));
这也应该在数据库中生成有效的查询。