IT

LINQ 쿼리 결과 집합에서 DataSet 또는 DataTable 채우기

lottoking 2020. 7. 4. 10:02
반응형

LINQ 쿼리 결과 집합에서 DataSet 또는 DataTable 채우기


LINQ 쿼리를 ASMX 웹 서비스로 어떻게 노출합니까? 일반적으로 비즈니스 계층에서 유형을 반환 DataSet하거나 DataTableASMX를 통한 전송을 위해 직렬화 할 수 있습니다.

LINQ 쿼리에 대해 동일한 작업을 수행하려면 어떻게해야합니까? 타이핑 DataSet하거나 DataTableLINQ 쿼리를 통해 채우는 방법이 있습니까?

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 웹 서비스로 노출시킬 수 있습니까?


질문에서 언급 한 바와 같이, 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>();

왜 그렇게되지 않습니까?


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'로 암시 적으로 변환 할 수 없습니다. 명시적인 전환이 존재합니다 (캐스트가 누락 되었습니까?)


두 개의 매퍼 인 데이터 전송 오브젝트 세트를 작성하고 .asmx를 통해이를 리턴하십시오. 프로 시저 스키마의 변경 사항은 웹 서비스 이용자에게 알리지 않고 전파되므로 데이터베이스 오브젝트를 직접 노출
해서는 안됩니다 .


의 반환 유형을 사용하면 쿼리 변수를 직접 IEnumerable반환 할 수 있습니다.


클래스 객체를 생성 list(T)하고 쿼리를 반환 합니다.


반환 유형을 사용하는 경우 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>();

For the sake of completeness, these solutions do not work for EF Core (at least not for EF Core 2.2). Casting to IEnumerable<DataRow>, as suggested in the other answers here, fails. Implementing this class and extension methods worked for me https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow.

Why it's not built into EF Core, I have not idea.

참고URL : https://stackoverflow.com/questions/16/filling-a-dataset-or-datatable-from-a-linq-query-result-set

반응형