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


137

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

답변:


87

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

왜 그렇게되지 않습니까?


29
CopyToDataTable ()이 컴퓨터에서 작동하지 않는 이유를 궁금해하는 모든 사람에게이 기능은 .NET 3.5 SP1의 일부가 아니며 .NET 4.0의 기능도 아닙니다. 그것은는 IEnumerable <데이터 행>로 제한하고는 IEnumerable <T>에 대한 작업을하지 않는 한 - bit.ly/dL0G5
모토

26

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


22

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


15

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



2

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>();

0

완벽을 기하기 위해 이러한 솔루션은 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에 내장되어 있지 않은지 모르겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.