我试图将SQL查询转换为LINQ查询

时间:2015-05-19 01:30:48

标签: c# sql linq

我正在尝试转换这个确切的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的新手。

2 个答案:

答案 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)));

这也应该在数据库中生成有效的查询。