C# 我正在尝试将SQL查询转换为LINQ查询
我正试图将获取A和B之间不同飞行路径的SQL查询转换为LINQ查询:C# 我正在尝试将SQL查询转换为LINQ查询,c#,sql,linq,C#,Sql,Linq,我正试图将获取A和B之间不同飞行路径的SQL查询转换为LINQ查询: SELECT F1.DepartingFromId, F1.ArrivingAtId FROM dbo.Flights AS F1 WHERE F1.DepartingFromId = 1 GROUP BY F1.ArrivingAtId, F1.DepartingFromId 如果我在上面的SQL中使用aforeach(机场中的机场),它将得到一个不同路径的列表,例如,路径a到B中只有一个 到目前为止,我已经
SELECT F1.DepartingFromId, F1.ArrivingAtId
FROM dbo.Flights AS F1
WHERE F1.DepartingFromId = 1
GROUP BY F1.ArrivingAtId, F1.DepartingFromId
如果我在上面的SQL中使用aforeach(机场中的机场)
,它将得到一个不同路径的列表,例如,路径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));
}
}
但是,这将返回数据库中的所有航班。大概有200000行。应该有大约70个不同的连接
任何帮助都将不胜感激,因为我是LINQ/Lambda的新手。我不明白为什么这会返回所有航班,因为您正在过滤
where
条件flight.DepartingFromId==airport.Id
要获取不同的,请选择
- 将键值(
)分组为g.key
ArrivingAtId
- 您在
子句(即where
)中筛选的airport.Id
)出发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);
在我看来,这将是一种更清晰的方式——它避免了不必要的分组:
distinctFlights.AddRange(
(
from flight in _DbContext.Flights
where flight.DepartingFromId == airport.Id
select flight.ArrivingAtId
)
.Distinct()
.ToArray()
.Select(x => new DistinctConnection(airport.Id, x)));
这也会在数据库中生成有效的查询。您是否检查了
出发Id
和机场Id
值?PS:不清楚为什么需要groupby
这里在SQL中使用groupby
子句是没有意义的,因为没有聚合函数。使用DISTINCT
关键字似乎更符合逻辑,这也正是您在LINQ中应该做的。是的,我非常确定这一部分没有问题,我认为LINQ中的group与SQL中的group by不同。虽然group by
没有“错误”,但,它不是一个有用的应用程序,因为groupby
的目的是方便聚合查询DISTINCT
是查询不同记录时的正确关键字。对不起,我不反对,非常感谢您的评论。我只是说SQL并不是我真正的问题,它从LINQ得到的结果是相同的,这就是问题所在。我下面选择的答案有效。也谢谢你让我知道DISTINCE关键字,我以后会用它的。虽然我不得不改为感谢你的帮助,但这很有效。