Заполнение 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?

Решение

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

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

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

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

Комментарии (1)

Выполнить этот вопрос против класса 'DataContext', you' ll должен сделать следующее:

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

Без 'как IEnumerable< DataRow>'; Вы будете видеть следующую ошибку компиляции:

не Может неявно преобразовать тип ' Система. Коллекции. Универсальный. IEnumerable< AnonymousType#1> ' к ' Система. Коллекции. Универсальный. IEnumerable< Система. Данные. DataRow> '. явное преобразование существует (Вы скучаете по броску?)

Комментарии (0)

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

Комментарии (0)

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

Комментарии (0)

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

Комментарии (0)

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

MyDataContext db = new MyDataContext();
IEnumerable query = 
    (from order in db.Orders.AsEnumerable()
        select new
        {
            order.Property,
            order.Property2
        })
    as IEnumerable;
return query.CopyToDataTable();
Комментарии (0)

Ради полноты эти решения не работают на Ядро EF (по крайней мере, не для Основных 2.2 EF). Кастинг к 'IEnumerable< DataRow&gt'; как предложено в других ответах здесь, терпит неудачу. Осуществление этого класса и дополнительных методов работало на меня https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow.

Почему it' s не встроенный в Ядро EF, у меня нет идеи.

Комментарии (0)