如何使用LINQ设置数据库的自动补全功能

本文关键字:全功能 数据库 何使用 LINQ 设置 | 更新日期: 2023-09-27 17:51:01

我想使用LINQ为文本框设置自动补全功能。我已经以一种方式使用了sqlCommands。代码是

  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中添加相同的特性。

如何使用LINQ设置数据库的自动补全功能

逐个添加字符串到AutoCompleteStringCollection是没有效率的。因为当每个字符串被添加时,内部数组列表确保其容量,如果没有足够的空间容纳新字符串,则会调整存储大小(使其大两倍)。此外,在每个添加的字符串CollectionChangedEvent将尝试开火。当您通过AddRange添加值时,存储仅调整一次大小,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;

using 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>(); }
    }
  }

根据我的理解,您希望将上面的代码转换为它的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;