使用Linq和EF检查少量行和列的最佳实践

时间:2012-08-21 22:26:07

标签: c# sql-server entity-framework

我在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的最佳解决方案或做法是什么?

2 个答案:

答案 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...
    }
}

嗯,你处理支票的方式还可以。这是做到这一点的标准方式。 LINQEntity Framework将生成优化查询并将其发送到数据库。因此,繁重的工作将在数据库方面进行。

答案 1 :(得分:0)

不要检查确切的坐标,而是查看范围:

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