2008-08-01 90 views
106

如何將LINQ查詢作爲ASMX Web服務公開?通常,從業務層,我可以返回一個輸入的DataSetDataTable,可以序列化以便通過ASMX傳輸。從LINQ查詢結果集中填充DataSet或DataTable

我該如何爲LINQ查詢做同樣的事情?有沒有辦法通過LINQ查詢填充鍵入的DataSetDataTable

public static MyDataTable CallMySproc() 
{ 
    string conn = "..."; 

    MyDatabaseDataContext db = new MyDatabaseDataContext(conn); 
    MyDataTable dt = new MyDataTable(); 

    // execute a sproc via LINQ 
    var query = from dr 
       in db.MySproc().AsEnumerable 
       select dr; 

    // copy LINQ query resultset into a DataTable -this does not work !  
    dt = query.CopyToDataTable(); 

    return dt; 
} 

我怎樣才能得到結果集LINQ查詢到DataSetDataTable?或者,LINQ查詢是否可序列化,以便我可以將它公開爲ASMX Web服務?

回答

73

正如在問題中提到,IEnumerableCopyToDataTable方法:

IEnumerable<DataRow> query = 
    from order in orders.AsEnumerable() 
    where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1) 
    select order; 

// Create a table from the query. 
DataTable boundTable = query.CopyToDataTable<DataRow>(); 

爲什麼不會爲你工作?

+28

爲了大家想知道爲什麼CopyToDataTable()在他們的機器上不起作用:這個函數不是.NET 3.5 SP1的一部分,也不是.NET 4.0的;它已被限制爲IEnumerable ,並且不適用於IEnumerable - http://bit.ly/dL0G5 – motto 2010-02-02 22:00:11

13

如果您使用的IEnumerable返回類型,你可以直接返回您查詢變量。

7

創建一個類對象並返回查詢的list(T)

18

製作一組數據傳輸對象,一對映射器,並通過.asmx返回。
您應該從不直接暴露數據庫對象,因爲過程模式中的更改將傳播到Web服務使用者而不會發現它。

22

要執行鍼對DataContext類此查詢,你需要做到以下幾點:

MyDataContext db = new MyDataContext(); 
IEnumerable<DataRow> query = 
    (from order in db.Orders.AsEnumerable() 
     select new 
     { 
      order.Property, 
      order.Property2 
     }) 
    as IEnumerable<DataRow>; 
return query.CopyToDataTable<DataRow>(); 

沒有as IEnumerable<DataRow>;,你會看到下面的編譯錯誤:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)