我正在尝试学习如何使用LinqServerModeDataSource DevExpress 控件。承诺是控件将接受可查询(查询),动态修改它,并从数据库服务器中仅提取需要显示的数据。在处理大型数据集时,这应该会带来更快的性能。
我正在使用实体框架 4.1。我所有的对象都是用 ADO.NET POCO Entity Generator (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 语句更改为 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 语句):
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语句来确保正确处理对象。此外,在我的应用程序中,需要将数据层保存在单独的项目中。如果我必须有开放的数据上下文,那么我如何保持这种分离?
谢谢