2008-08-01 91 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?)