2012-07-15 49 views
3

我是新來的LINQ,我想轉換LINQ查詢數據表LINQ到DataTable中容易和快速

DataClassesDataContext db = new DataClassesDataContext(MyConncectionString); 
    IEnumerable<DataRow> qry = (IEnumerable<DataRow>)(from tbl in db.Table1.AsEnumerable() 
                select tbl); 
    DataTable dt=new DataTable(); 
    qry.CopyToDataTable(dt, LoadOption.OverwriteChanges); 
    GridView1.DataSource = dt; 

但我得到錯誤

無法轉換類型的「對象WhereSelectEnumerableIterator鍵入'System.Collections.Generic.IEnumerable`1 [的System.Data.DataRow]'。

任何人都可以請幫我,

+0

嘗試更改爲「var qry =從db.Table1中的tbl中選擇tbl」; – Nik 2012-07-15 11:51:27

回答

1

這些基本概念:

有附帶使用.NET Framework

  • LINQ到對象幾個LINQ提供程序。 System.Linq的。這是LINQ核心,它被設計爲與內存收藏一起工作

  • LINQ to XML。 System.Xml.Linq使用XML文檔

  • LINQ to DataSet。使用DataTable和DataSet對象

  • LINQ to SQL。 System.Data.Linq它用於使用SQL Server數據庫

  • LINQ to Entities。 (實體框架)用於處理多個數據庫。它提供了一個更豐富的API

我知道你在試圖做的是:

從查詢從LINQ返回SQL背景下,要返回DataRow對象的集合。

有到SQL對象和一個DataRow一個LINQ之間不存在簡單的轉換,因此,如果你堅持,你就需要使用反射來獲取所需的輸出Fastest way to fill DataTable from LINQ query using DataContext

現在,如果你真的要使用DataTable對象,那麼我的建議是使用強類型的DataSet。要創建一個,只是一個新的DataSet對象添加到您的項目,並從服務器資源管理器拖放表像你將與你的LINQ to SQL做對象

如果可能的話,評估使用DataRow,而是返回所產生的對象的決定LINQ to SQL,或者甚至更好地創建您的自定義DTO對象

關於您的代碼,我沒有看到任何理由嘗試使用Datatable對象(除非您發佈額外的代碼來證明此決定)。如果你只是想設置一個控制的DataSource財產,只要做到以下幾點:

var q = from tbl in db.Table1 
     select tbl; 

this.myControl.DataSource = q; 
this.myControl.DataBind(); 

如果你需要,你可以將結果轉化爲一個匿名對象,並用它作爲DataSource

var q = from tbl in db.Table1 
     select new 
     { 
      MyNewProperty = tbl.ExistingProperty, 
      AnotherProperty = tbl.MyCoolerProperty 
     }; 

this.myControl.DataSource = q; 
this.myControl.DataBind(); 
+0

完美!謝謝。我錯過了GridView.DataBind(); – Atif 2012-07-15 12:42:15

+0

所以,當你編寫'this.myControl,Databind()'時,你將控件綁定到q,對吧?如果我對此控件的數據進行任何更改,是否將此數據保存到數據庫中? – Camus 2012-11-02 07:17:45

+0

否。爲了保存_automatically_,您需要使用**數據源控件**,例如「EntityDataSource」或「LinqDataSource」控件 – Jupaol 2012-11-02 20:31:29

1

我認爲這是不必要在這裏轉化成LINQ?因爲你已經得到了數據表,你正在LINQING,並再次轉換回LINQ。所以除非你有合理的理由在這裏,你應該堅持數據表。

 DataClassesDataContext db = new DataClassesDataContext(MyConncectionString); 
    IEnumerable<DataRow> qry = (IEnumerable<DataRow>)(from tbl in db.Table1.AsEnumerable() 
               select tbl); 
    DataTable dt=new DataTable(); 
    qry.CopyToDataTable(dt, LoadOption.OverwriteChanges); 
    GridView1.DataSource = dt; 

應該是,

GridView1.DataSource = db.Table1