0

我在 MSSQL 中有一张表:

int Id
int Col
int Row

我有一个瓷砖地图,上面有一些物体。每个对象的位置是左上角的瓦片(行号和列号)。对象可以占用很少的瓷砖。

例如,我有一个大小为 3х3的对象。此图块的位置是第 5 行和第10 列

 IEnumerable<int> checkRows = Enumerable.Range(5, 3); // 5, 6, 7
 IEnumerable<int> checkCol = Enumerable.Range(10, 3); // 10, 11, 12

在数据库中添加新对象之前,我需要检查该区域中的现有对象:

5:10 | 5:11 | 5:12
6:10 | 6:11 | 6:12
7:10 | 7:11 | 7:12

如果某个对象在 7:12 的位置,我会在找到它之前查询数据库太多。

对于我用过的一块瓷砖:

 db.TileSet.Any(x => x.Col == col & x.Row == row)

在这种情况下,使用 Linq 避免 CPU 高负载的最佳解决方案或做法是什么?

4

2 回答 2

0
foreach(var tile in TilesToCheck)
{
    if(db.TileSet.Any(x => x.Col == tile.Col && x.Row == tile.Row))
    {
      // TODO: break the Save operation or whatever...
    }
}

嗯,你处理支票的方式没问题。这是执行此操作的标准方法。LINQ并将Entity Framework生成优化查询并将其发送到数据库。因此,繁重的工作将在数据库方面。

于 2012-08-21T22:32:27.370 回答
0

与其检查确切的坐标,不如查看一个范围:

db.TileSet.Any(x =>
  x.Col >= col && x.Col <= col + 2 &&
  x.Row >= row && x.Row <= row + 2
)
于 2012-08-21T22:37:18.850 回答