LINQ找到最近的坐标

sir*_*ius 3 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)));
Run Code Online (Sandbox Code Playgroud)

我该如何优化呢?

Bac*_*cks 5

  1. 你不能计算Math.Sqrt - 没关系(3> 2和3*3> 2*2)
  2. 您可以按dist排序并先取下:

var closest = _context.Coordinates.OrderBy(x =>
               Math.Pow((point.coordX - x.CoordX), 2) + Math.Pow((point.WinningCoordY - x.CoordY), 2))
             .First();
Run Code Online (Sandbox Code Playgroud)
  1. 另外,将Math.Pow替换为乘法 - 它会更快:

var closest = _context.Coordinates.OrderBy(x =>
               (point.coordX - x.CoordX) * (point.coordX - x.CoordX) + (point.WinningCoordY - x.CoordY) * (point.WinningCoordY - x.CoordY))
             .First();
Run Code Online (Sandbox Code Playgroud)


Chr*_*tos 5

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

使用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();
Run Code Online (Sandbox Code Playgroud)