0

クエリを実行する必要がある 120 万行ほどの大きなテーブルがあります。同じフィールドに含まれています。リストを使用して照会する必要があるフィールド combined_name があります。パフォーマンスをチェックするために、今のところ 1 つのフィールドだけで実行しようとしていますが、それはコードに反映されています。私が書いた方法では、時間がかかりすぎます。テーブルをメモリにロードする必要がない方法はありますか?

JDataClassDataContext db = new JDataClassDataContext();
var fullName = txtSearchBox0.Text.Trim();
List<string> firstName = new List<string>(txtSearchBox1.Text.Split(',').Select(x => Convert.ToString(x)).ToList());

var rows = (from c in db.defendants_ALLs.AsEnumerable()
      where c.combined_name.Contains(fullName)
          && firstName.Any(n => c.combined_name.Contains(n))
      select c).ToList();     

dlSearch.DataSource = rows;
dlSearch.DataBind();
4

2 に答える 2

1

Skip( )メソッドとTake()メソッドを確認してください。

次のように使用できます。

var rows = (from c in db.defendants_ALLs.AsEnumerable()
           where c.combined_name.Contains(fullName)
           && firstName.Any(n => c.combined_name.Contains(n))
           select c).OrderBy(o => o.id).Skip(amount).Take(otherAmount).ToList();

ここで、データベースから実際にフェッチするレコードの量amountotherAmount表します。これは、120万件のレコードではなく、30件のレコードしか要求できないことを意味します(==これを実行するとどうなるか.ToList()

于 2012-10-07T18:24:51.547 に答える
1

最良の方法は、"SELECT fields FROM table WHERE combined_name LIKE '%fullname%' AND firstName IN ('first', 'next',...)" のような古き良き SQL クエリを生成することです。および SqlCommand と SqlDataReader です。linq とは少し異なりますが、はるかに高速です (適切なインデックスがある場合)。

于 2012-10-07T18:32:18.760 に答える