首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >网格视图中的复杂对象

网格视图中的复杂对象
EN

Stack Overflow用户
提问于 2012-09-03 00:16:40
回答 2查看 182关注 0票数 4

我有一个网格视图,它的数据源是以下函数:

代码语言:javascript
运行
复制
public static List<Train> GetTrainsByIDs(int [] ids) {
    using (var context = new MyEntities()) 
    {
        return ids.Select(x => context.Trains.Single(y => y.TrainID ==x)).AsQueryable().Include(x=>x.Station).ToList();
    }
}

网格视图的ItemTemplate为<%# Eval("Station.Name") %>。这会导致错误The ObjectContext instance has been disposed and can no longer be used for operations that require a connection,尽管我使用了include方法。

当我将函数更改为

代码语言:javascript
运行
复制
public static List<Train> GetTrainsByIDs(int [] ids) {
    using (var context = new MyEntities()) 
    {
        return context.Trains.Where(x => ids.Contains(x.TrainID)).Include(x=>x.Station).ToList();
    }
}

它工作得很好,但他们出来的顺序错了,而且如果我有两个相同的in,我希望在列表中有两个相同的火车。

除了创建新的视图模型之外,我还能做什么吗?感谢您的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-06 02:10:43

在阅读了@Gert Arnold的答案,并得到了分两个阶段完成它的想法后,我非常简单地使用了第一个查询,如下所示:

代码语言:javascript
运行
复制
using (context = new MyEntities())
{
    var trns = context.Trains.Include(x => x.Station);
    return ids.Select(x => trns.Single(y => y.TrainID == x)).ToList();
}
票数 0
EN

Stack Overflow用户

发布于 2012-09-03 05:55:03

至于第一个查询:延迟execution.You创建了一个Trains的IEnumerable,注意到它没有Include方法,所以将它转换为IQueryable,添加了Include并添加了ToList()以防止延迟加载。

但根据MSDN on DbExtensions.Include

此扩展方法调用IQueryable源对象的Include(String)方法(如果存在这样的方法)。如果源IQueryable没有匹配的方法,则此方法不执行任何操作。

(强调我的)

select的结果是一个转换为IQueryableIEnumerable,但现在由不实现IncludeEnumerableQuery实现。什么都不会发生。

现在数据进入试图显示站点的网格,这会在上下文消失时触发延迟加载。

除此之外,这种设计还有另一个缺陷:它分别为每个id触发一个查询。

所以第二个查询要好得多。这是一个查询,包括Station,但现在顺序由数据库希望返回的顺序决定。你可以使用Concat来解决这个问题:

代码语言:javascript
运行
复制
IQueryable<Train> qbase = context.Trains.Include(x=>x.Station);
IQueryable<Train> q = null;

foreach (var id in ids)
{
  var id1 = id; // Prevent modified closure.
  if (q == null)
    q = qbase.Where(t => t.Id == id1);
  else
    q = q.Concat(qbase.Where (t => t.Id == id1));
}

生成的查询不是很优雅(至少可以这么说),但毕竟它是一个查询,而不是多个查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12237601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档