我正在尝试学习如何使用 LinqServerModeDataSource DevExpress控件。承诺是控件将接受可查询(查询),动态修改它,并从数据库服务器中仅提取需要显示的数据。在处理大型数据集时,这应该会带来更快的性能。
我正在使用Entity Framework 4.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 context(注意使用语句):
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;
}
在这种情况下,我没有数据行 那么,这里发生了什么?我被认为总是使用使用语句来确保正确的对象处理。此外,在我的应用程序中,需要将数据层保存在单独的项目中。如果我必须有开放数据上下文,那么我该如何保持这种分离?
谢谢