LinqServerModeDataSourceDevExpressコントロールの使用方法を学ぼうとしています。約束は、コントロールがクエリ可能(クエリ)を受け入れ、それを動的に変更し、データベースサーバーから表示する必要のあるデータのみをプルすることです。これにより、大規模なデータセットを処理する際のパフォーマンスが向上します。
EntityFramework4.1を使用しています。すべてのオブジェクトは、ADO.NET POCOエンティティジェネレーター(ObjectContext)で作成されます
私がこれまでにしたこと:
ASPxGridViewとLinqServerModeDataSourceコントロールのページにドロップし、必要なすべての配線を行いました...
LinqServerModeDataSource1_Selectingメソッドでは、次のようなものがあります。
e.KeyExpression = "CarwashId";
e.QueryableSource = Carwashes.GetCarWashes().AsQueryable();
私のGetCarWashesメソッドは次のように定義されています。
public static IQueryable<Carwash> GetCarWashes()
{
using (var ctx = new LMEntities(PBase.EntityFrameworkConnectionString))
{
var query = from c in ctx.Carwashes
join d in ctx.Stations on c.StationId equals d.StationId
orderby d.Number
select c;
return query;
}
}
問題は、常に空のグリッドが表示され、結果が得られないことです。EFについてこれまでに学んだことからすると、クエリは実際には評価されないため、それは理にかなっています。上記のメソッドのreturnステートメントを変更してquery.ToList()を返すと、もちろん、レコードがグリッドに表示されますが、それはLinqServerModeDataSourceコントロールの目的を損なうものではありませんか?
質問:
これは、データコンテキストが破棄されているという問題に関連していることを私は知っています。したがって、LinqServerModeDataSource1_Selectingの 場所コードを次のように入力すると、次のようになります。
var ctx = new LMEntities();
e.QueryableSource = from c in ctx.Carwashes
join d in ctx.Stations on c.StationId equals d.StationId
orderby d.Number
select c;
すべてが正常に機能し、レコードが表示されます。
しかし、私がこのようなdisposeコンテキストを使用する場合(ステートメントを使用していることに注意してください):
using (var ctx = new LMEntities());
{
e.QueryableSource = from c in ctx.Carwashes
join d in ctx.Stations on c.StationId equals d.StationId
orderby d.Number
select c;
}
この場合、データ行は取得されません。
それで、ここで何が起こっているのですか?適切なオブジェクトの廃棄を確実にするために、私は常にusingステートメントを使用すると考えられていました。また、私のアプリケーションでは、データレイヤーを別のプロジェクトに保持する必要があります。オープンデータコンテキストが必要な場合、この分離を維持するにはどうすればよいですか?
ありがとう