【问题标题】:How to set autocomplete feature from database using LINQ?如何使用 LINQ 从数据库设置自动完成功能?
【发布时间】:2012-12-23 04:51:35
【问题描述】:

我想使用 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;

有了这个,我可以将 autocomplecustom 源添加到文本框。现在我想添加 与 LINQ 相同的功能。请任何人帮助我..

【问题讨论】:

  • 一个更好的问题是“如何在不将整个表格读入AutoCompleteSource的情况下做到这一点?”

标签: c# winforms linq autocomplete


【解决方案1】:

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;

【讨论】:

  • 以及如何在不将整个表格读入AutoCompleteSource的情况下做到这一点?
  • @drzaus 你不能不将所有数据读入 AutoCompleteStringCollection。考虑从该类派生一些自定义实现
  • 确保在执行此操作时从查询中删除任何空值。我没有这样做,当设置 AutoCompleteCustomSource 没有错误消息或调试信息时它会崩溃。
【解决方案2】:

使用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 派生对象。阅读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
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 2019-02-27
    • 2021-06-24
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2013-10-03
    • 2022-08-15
    相关资源
    最近更新 更多