Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 网格视图中的复杂对象_C#_Entity Framework_Gridview_Lazy Loading - Fatal编程技术网

C# 网格视图中的复杂对象

C# 网格视图中的复杂对象,c#,entity-framework,gridview,lazy-loading,C#,Entity Framework,Gridview,Lazy Loading,我有一个gridview,其数据源是以下函数: 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.Stati

我有一个gridview,其数据源是以下函数:

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();
    }
}
它可以正常工作,但是它们的顺序是错误的,而且如果我有两个相同的ID,我希望列表中有两列相同的列车


除了创建新的viewmodel,我还能做什么?感谢您对第一个查询的帮助:这是延迟执行。您创建了一个
Train
s的
IEnumerable
,注意到它没有
Include
方法,所以将其转换为
IQueryable
,添加了Include并添加了
ToList()
,以防止延迟加载

但根据:

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

(强调矿山)

选择的结果是一个
IEnumerable
转换为
IQueryable
,但现在由它实现,它不实现
包含
。什么也没发生

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

除此之外,这种设计还有另一个缺陷:它分别对每个id进行查询

因此,第二个查询要好得多。这是一个查询,包括
s。但是现在,顺序是由数据库希望返回的顺序决定的。您可以使用
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));
}
IQueryable qbase=context.Trains.Include(x=>x.Station);
IQueryable q=null;
foreach(id中的变量id)
{
var id1=id;//防止修改闭包。
if(q==null)
q=qbase.Where(t=>t.Id==id1);
其他的
q=q.Concat(qbase.Where(t=>t.Id==id1));
}

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

在阅读了@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();
}

我想要重复的-我写了我想要两列相同的火车在列表中。顺序是至关重要的——ID列表代表了一个人旅程中的列车列表,并且必须按照正确的顺序进行旅程。我所要做的就是去掉“正在使用的”并依靠垃圾收集。是的,对不起,你的问题很清楚,我的头脑不清楚。我已经修改了关于第二个问题的答案。对第一个查询的分析是正确的。我会选择一个显式处理上下文的场景。谢谢,请看我的答案
using (context = new MyEntities())
{
    var trns = context.Trains.Include(x => x.Station);
    return ids.Select(x => trns.Single(y => y.TrainID == x)).ToList();
}