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

голоса
109

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

Задан 01/08/2008 в 05:59
источник пользователем
На других языках...                            


7 ответов

голоса
15

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

Ответил 01/08/2008 в 15:10
источник пользователем

голоса
10

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

Ответил 08/08/2008 в 13:17
источник пользователем

голоса
76

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

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

Ответил 15/08/2008 в 17:27
источник пользователем

голоса
21

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

Ответил 15/08/2008 в 17:42
источник пользователем

голоса
24

Для выполнения этого запроса к 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». Явное преобразование существует (вы пропали без вести броска?)

Ответил 13/02/2009 в 01:10
источник пользователем

голоса
3

Если вы используете тип возвращаемого IEnumerable.Это помогает вернуть переменный запрос непосредственно.

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>();
Ответил 11/04/2018 в 11:55
источник пользователем

голоса
0

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

Почему он не встроен в EF Ядра, я не имею понятия.

Ответил 20/06/2019 в 23:14
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more