4

LINQ を使用して、オートコンプリート機能をテキスト ボックスに設定したいと考えています。私はすでに sqlCommands で 1 つの方法で行いました。コードは

  OleDbCommand cmdinst = new OleDbCommand("select distinct cst_City from cstTable", con);
            OleDbDataReader drinst = cmdinst.ExecuteReader();
            AutoCompleteStringCollection instcol = new AutoCompleteStringCollection();
            while (drinst.Read())
            {
                instcol.Add(drinst.GetString(0));
            }
            txtCity.AutoCompleteCustomSource = instcol;

これで、オートコンプリート カスタム ソースをテキスト ボックスに追加できます。今度は LINQ で同じ機能を追加したいと思います。誰か助けてください..

4

3 に答える 3

3

AutoCompleteStringCollection文字列を1 つずつ追加するのは効率的ではありません。各文字列が追加されると、内部配列リストがその容量を確保し、新しい文字列に十分なスペースがない場合はストレージのサイズを変更する (2 倍にする) ためです。また、追加された各文字列CollectionChangedEventが発火しようとします。AddRangeストレージを介して値を追加すると、サイズが 1 回だけ変更され、1 回CollectionChangedEventだけ起動されます。

Distinctまた、グループ化して最初のグループを選択する代わりに、単純に演算子を適用することもできます。

var db = FooDataContext();
var cities = db.cstTable.Select(c => c.cst_City).Distinct().ToArray();

AutoCompleteStringCollection instcol = new AutoCompleteStringCollection();
instcol.AddRange(cities);
txtCity.AutoCompleteCustomSource = instcol;
于 2013-01-09T07:56:23.970 に答える
1

私の理解によると、上記のコードを同等のLINQに変換する必要があります。手順は次のとおりです

1-DBコンテキストオブジェクトを作成します

2-クエリを書く

3-データを取得して表示する

YourDBNameDataContext context = new YourDBNameDataContext();
var drinst = context.cstTable.Select(item => item.cst_City).Distinct();

foreach (string city in drinst )
{
    instcol.Add(city);
}
txtCity.AutoCompleteCustomSource = instcol;
于 2013-01-09T07:34:20.257 に答える
1

Linq To SQL の使用

クエリは次のように削減されます

 AutoCompleteStringCollection instcol = new AutoCompleteStringCollection();
 dbContext.CstTable.Select (x => x.cst_City)
          .GroupBy (x=>x).Select (grouping => grouping.First())
           .ToList().ForEach (x=> instcol.Add(x))
 txtCity.AutoCompleteCustomSource = instcol;

dbContextDataContext派生オブジェクトです。このオブジェクトの作成方法については、こちらをお読みください。

// custom datacontext class
 public class CustomDataContext : DataContext
 {  
    private static readonly string connectionString =
      @"Data Source=.\SQLExpress;Initial Catalog=<db name>;" +
      "Integrated Security=True"; // From the app.config

    public CustomDataContext() : base(connectionString) { }

    public Table<Cst_City> Cst_City
    {
      get { return this.GetTable<Cst_City>(); }
    }
  }
于 2013-01-09T07:31:09.323 に答える