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

C# 如何使用LINQ从数据库设置自动完成功能?,c#,winforms,linq,autocomplete,C#,Winforms,Linq,Autocomplete,我想使用LINQ将自动完成功能设置为文本框。我已经用sqlCommands以一种方式完成了。代码是 OleDbCommand cmdinst = new OleDbCommand("select distinct cst_City from cstTable", con); OleDbDataReader drinst = cmdinst.ExecuteReader(); AutoCompleteStringCollection instcol

我想使用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;
有了它,我可以将AutoCompleteCustom源添加到文本框中。现在我想添加与LINQ相同的功能。请任何人帮助我。

使用

您的查询减少到

 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
是派生对象。阅读以了解如何创建此对象

// 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>(); }
    }
  }
//自定义datacontext类
公共类CustomDataContext:DataContext
{  
私有静态只读字符串连接字符串=
@“数据源=。\SQLExpress;初始目录=;”+
“Integrated Security=True”;//来自app.config
公共CustomDataContext():基(connectionString){}
公共表格Cst_城市
{
获取{返回this.GetTable();}
}
}

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

将字符串逐个添加到
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更好的问题是“如何在不将整个表读入
AutoCompleteSource
”的情况下执行此操作,以及如何在不将整个表读入
AutoCompleteSource
”的情况下执行此操作?@drzaus如果不将所有数据读入AutoCompleteStringCollection,则无法执行此操作。考虑从该类派生一些自定义实现,确保您在查询时从查询中剔除任何空值。我没有这样做,当设置
AutoCompleteCustomSource
时,它会崩溃,没有错误消息或配音信息。