我有一个网格视图,它的数据源是以下函数:
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方法。
当我将函数更改为
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,我希望在列表中有两个相同的火车。
除了创建新的视图模型之外,我还能做什么吗?感谢您的帮助
发布于 2012-09-06 02:10:43
在阅读了@Gert Arnold的答案,并得到了分两个阶段完成它的想法后,我非常简单地使用了第一个查询,如下所示:
using (context = new MyEntities())
{
    var trns = context.Trains.Include(x => x.Station);
    return ids.Select(x => trns.Single(y => y.TrainID == x)).ToList();
}发布于 2012-09-03 05:55:03
至于第一个查询:延迟execution.You创建了一个Trains的IEnumerable,注意到它没有Include方法,所以将它转换为IQueryable,添加了Include并添加了ToList()以防止延迟加载。
但根据MSDN on DbExtensions.Include
此扩展方法调用IQueryable源对象的Include(String)方法(如果存在这样的方法)。如果源IQueryable没有匹配的方法,则此方法不执行任何操作。
(强调我的)
select的结果是一个转换为IQueryable的IEnumerable,但现在由不实现Include的EnumerableQuery实现。什么都不会发生。
现在数据进入试图显示站点的网格,这会在上下文消失时触发延迟加载。
除此之外,这种设计还有另一个缺陷:它分别为每个id触发一个查询。
所以第二个查询要好得多。这是一个查询,包括Station,但现在顺序由数据库希望返回的顺序决定。你可以使用Concat来解决这个问题:
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));
}生成的查询不是很优雅(至少可以这么说),但毕竟它是一个查询,而不是多个查询。
https://stackoverflow.com/questions/12237601
复制相似问题