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