如何使用 LINQ 从数据库设置自动完成功能?

问题描述 投票:0回答:3

我想使用 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 相同的功能。请任何人帮助我..

c# winforms linq autocomplete
3个回答
3
投票

将字符串一一添加到

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;

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;

dbContext
DataContext
派生对象。阅读 this 了解如何创建此对象。

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

1
投票

根据我的理解,您希望将上述代码转换为其 LINQ 等效代码。以下是步骤

1- 创建数据库上下文对象

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;
© www.soinside.com 2019 - 2024. All rights reserved.