2013-01-09 116 views
4

我想使用LINQ將自動完成功能設置爲文本框。我已經用sqlCommands的一種方式做了。代碼是如何使用LINQ從數據庫設置自動完成功能?

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相同的功能。請任何一個幫助我..

+0

更好的問題是「如何在不將整個表讀入AutoCompleteSource的情況下執行此操作?」 – drzaus

回答

2

添加串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; 
+0

以及如何在不將整個表格讀入'AutoCompleteSource'的情況下執行此操作? – drzaus

+0

@drzaus你不能沒有讀取所有數據到AutoCompleteStringCollection。考慮從該類派生一些自定義實現 –

+0

確保在執行此操作時從您的查詢中去除任何空值。我沒有這樣做,並且在設置'AutoCompleteCustomSource'時沒有出現錯誤消息或者提供信息時會崩潰。 – jaredbaszler

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派生的對象。閱讀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>(); } 
    } 
    } 
+0

我喜歡你如何直接將結果轉換爲列表。 +1 –

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;