Заполнение DataSet или DataTable из набора результатов запроса LINQ

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

Как я могу сделать то же самое для запроса 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?

1.08.2008 04:59:33
7 ОТВЕТОВ
РЕШЕНИЕ

Как уже упоминалось в вопросе, 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>();

Почему это не работает для вас?

86
4.05.2012 09:01:40
Всем, кто интересуется, почему CopyToDataTable () не работает на их компьютере: эта функция не является частью .NET 3.5 SP1 и не будет .NET 4.0; он ограничен IEnumerable <DataRows> и не работает для IEnumerable <T> - bit.ly/dL0G5
motto 2.02.2010 22:00:11

Чтобы выполнить этот запрос к 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>;вы увидите следующую ошибку компиляции:

Не удается неявно преобразовать тип «System.Collections.Generic.IEnumerable» в «System.Collections.Generic.IEnumerable». Существует явное преобразование (вам не хватает приведения?)

26
17.12.2013 14:39:05

Создайте набор объектов переноса данных, пару картографов и верните их через .asmx.
Вы никогда не должны предоставлять объекты базы данных напрямую, поскольку изменение схемы процедуры будет распространяться на потребителя веб-службы без вашего ведома.

22
15.08.2008 16:42:54

Если вы используете тип возврата IEnumerable, вы можете вернуть свою переменную запроса напрямую.

15
18.10.2008 18:26:59

Создайте объект класса и верните list(T)запрос.

11
14.10.2012 12:13:18

Если вы используете тип возврата IEnumerable.It помогает вернуть вашу переменную запроса напрямую.

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>();
2
11.04.2018 11:55:31

Для полноты картины эти решения не работают для EF Core (по крайней мере, для EF Core 2.2). Приведение к IEnumerable<DataRow>, как это предлагается в других ответах здесь, не удается. Реализация этого класса и методов расширения работала для меня https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow .

Почему это не встроено в EF Core, я понятия не имею.

0
20.06.2019 20:14:05