3

我正在尝试学习如何使用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语句来确保正确处理对象。此外,在我的应用程序中,需要将数据层保存在单独的项目中。如果我必须有开放的数据上下文,那么我如何保持这种分离?

谢谢

4

0 回答 0