2008-08-01 3 views
106

Как вы выставляете запрос LINQ в качестве веб-службы ASMX? Обычно из бизнес-уровня я могу вернуть напечатанный DataSet или DataTable, который может быть сериализован для транспортировки по ASMX.Заполнение DataSet или DataTable из набора результатов запроса LINQ

Как я могу сделать то же самое для запроса LINQ? Есть ли способ заполнить типизированный DataSet или DataTable через запрос LINQ?

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 в DataSet или DataTable? В качестве альтернативы, является ли запрос LINQ сериализуемым, чтобы я мог представить его как веб-службу ASMX?

ответ

73

Как упомянуто в вопросе, IEnumerable имеет CopyToDataTable метод:

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.
Вы должны никогда не подвергайте объекты базы данных напрямую, так как изменение схемы процедуры будет распространяться на пользователя веб-службы без вашего уведомления.

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?)

Смежные вопросы