C# 网格视图中的复杂对象
我有一个gridview,其数据源是以下函数: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
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();
}