LINQ クエリ結果セットから DataSet または DataTable を入力する
-
08-06-2019 - |
質問
LINQ クエリを ASMX Web サービスとして公開するにはどうすればよいでしょうか?通常、ビジネス層からは型付きの値を返すことができます。 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 Web サービスとして公開できるようにシリアル化可能ですか?
解決
質問で述べたように、 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 経由で返します。
あなたがすべき 一度もない プロシージャ スキーマの変更は気付かないうちに Web サービス コンシューマに伝播するため、データベース オブジェクトを直接公開します。
戻り値の型を使用する場合、 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>();