LINQ查找最近坐标

时间:2015-08-25 12:15:31

标签: c# linq entity-framework

我的数据库中有坐标(x,y),我希望找到最接近点的坐标。 (可能有多个最接近这一点)

我写过这2个LINQ,但必须有一个聪明的方法,而不是两次通过数据库:

var closestDistance = _context.Coordinates.Min(x =>
                          Math.Sqrt(Math.Pow((point.coordX - x.CoordX), 2) +
                                    Math.Pow((point.coordY- x.CoordY), 2)));
var closest = _context.Coordinates.Where(x=> closestDistance ==
                          Math.Sqrt(Math.Pow((point.coordX - x.CoordX), 2) +
                                    Math.Pow((point.coordY - x.CoordY), 2)));

我如何优化这个?

2 个答案:

答案 0 :(得分:5)

  1. 你无法计算Math.Sqrt - 无关紧要(3> 2&3 * 3> 2 * 2)
  2. 您可以按dist排序并先取下:
  3. var closest = _context.Coordinates.OrderBy(x =>
                   Math.Pow((point.coordX - x.CoordX), 2) + Math.Pow((point.WinningCoordY - x.CoordY), 2))
                 .First();
    
    1. 另外,将Math.Pow替换为乘法 - 它会快得多:
    2. var closest = _context.Coordinates.OrderBy(x =>
                     (point.coordX - x.CoordX) * (point.coordX - x.CoordX) + (point.WinningCoordY - x.CoordY) * (point.WinningCoordY - x.CoordY))
                   .First();
      

答案 1 :(得分:3)

您可以使用分组。此外,您不必计算平方根。你可以只使用相应差异的平方和。

使用GroupBy,您可以构建一系列组,其关键是每个组的点与您感兴趣的点之间的距离。然后,您基于OrderBy组创建关键的价值。最后你选择了第一组。这包含您要查找的分数。

var closest = _context.Coordinates
                      .GroupBy(x => Math.Pow((point.coordX - x.CoordX), 2) + Math.Pow((point.WinningCoordY - x.CoordY), 2))
                      .OrderBy(x=>x.Key)
                      .First();