我在MSSQL中有一个表:
int Id
int Col
int Row
我有一个包含一些对象的tilemap。 每个对象的位置是左上方的图块(行号和列号)。 对象可以占用很少的区块。
例如,我有一个大小3х3的对象。 此图块的位置为第5行和第10列。
IEnumerable<int> checkRows = Enumerable.Range(5, 3); // 5, 6, 7
IEnumerable<int> checkCol = Enumerable.Range(10, 3); // 10, 11, 12
在DB中添加新对象之前,我需要检查此区域中的现有对象:
5:10 | 5:11 | 5:12
6:10 | 6:11 | 6:12
7:10 | 7:11 | 7:12
如果某个对象位于7:12位置,我会在查找之前查询DB太多。
对于我使用的一块瓷砖:
db.TileSet.Any(x => x.Col == col & x.Row == row)
在这种情况下,使用Linq避免高负载CPU的最佳解决方案或做法是什么?
答案 0 :(得分: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
将生成优化查询并将其发送到数据库。因此,繁重的工作将在数据库方面进行。
答案 1 :(得分:0)
不要检查确切的坐标,而是查看范围:
db.TileSet.Any(x =>
x.Col >= col && x.Col <= col + 2 &&
x.Row >= row && x.Row <= row + 2
)