0

MSSQL に 1 つのテーブルがあります。

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

DB に新しいオブジェクトを追加する前に、この領域の既存のオブジェクトを確認する必要があります。

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

オブジェクトが 7:12 の位置にある場合、DB を検索する前にクエリを実行しすぎます。

私が使用した1つのタイルの場合:

 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されたクエリを生成し、データベースに送信します。したがって、重労働はDB側になります。

于 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 に答える