我正在学习实体框架并撞上一面墙。这是我的代码:
public IOrderedEnumerable<ArchiveProcess> getHistory()
{
using (ArchiveVMADDatabase.ArchiveDatabaseModel dataContext = new ArchiveDatabaseModel())
{
var query = (from history in dataContext.ArchiveProcess.AsNoTracking()
orderby history.ArchiveBegin descending
select history).Take(10).ToList();
return query as IOrderedEnumerable<ArchiveProcess>;
}
}当我遍历这段代码时,query是一个List<ArchiveProcess>,包含了我想要的10个结果。但是,一旦我退出方法并释放上下文,query就会变为null。我怎么才能避免这种情况?我试过这样做:
select new ArchiveProcess
{
ArchiveBegin = history.ArchiveBegin,
ArchiveEnd = history.ArchiveEnd,
DeploysHistoryCount = history.DeploysHistoryCount,
MachinesHistory = history.MachinesHistory,
ScriptHistory = history.ScriptHistory
}但后来我收到了一个NotSupportedException。为什么一旦上下文被处理,实体框架就会删除我宝贵的实体,我如何让它停止呢?
发布于 2016-03-08 14:41:18
query as IOrderedEnumerable<ArchiveProcess>;query是一个List<ArchiveProcess>,当您尝试使用它向它没有实现的接口强制转换时,as返回null。List<ArchiveProcess>不是IOrderedEnumerable<ArchiveProcess>,所以query as IOrderedEnumerable<ArchiveProcess>是null。
IOrderedEnumerable<T>唯一不做的事情就是实现CreateOrderedEnumerable<TKey>,它可以直接调用,也可以通过ThenBy和ThenByDescending调用,因此您可以在可枚举项上添加一个次要排序,该排序只影响前面的排序所认为的等价项。
如果您不直接使用CreateOrderedEnumerable(),也不通过ThenBy()或ThenByDescending()使用,那么更改为不尝试使用它:
public IEnumerable<ArchiveProcess> getHistory()
{
using (ArchiveVMADDatabase.ArchiveDatabaseModel dataContext = new ArchiveDatabaseModel())
{
return (from history in dataContext.ArchiveProcess.AsNoTracking()
orderby history.ArchiveBegin descending
select history).Take(10).ToList();
}
}否则,重新应用排序,以便ThenBy等可以与其一起使用:
public IOrderedEnumerable<ArchiveProcess> getHistory()
{
using (ArchiveVMADDatabase.ArchiveDatabaseModel dataContext = new ArchiveDatabaseModel())
{
return (from history in dataContext.ArchiveProcess.AsNoTracking()
orderby history.ArchiveBegin descending
select history).Take(10).ToList().OrderBy(h => h.ArchiveBegin);
}
}但是这会增加更多的开销,所以如果不需要就不要这样做。
请记住,IOrderedEnumerable<T>不仅仅是一个有序的可枚举(所有可枚举的对象都是按某种顺序排列的,不管是任意的),它是一个有序的可枚举的,它了解排序的方式,以便为二次排序提供支持。如果你不需要它,那么你就不需要IOrderedEnumerable<T>。
发布于 2016-03-07 22:04:00
我认为有几种方法可以避免这种情况,但一般来说,你应该确切地知道你希望你的环境能活多久。通常,最好让using语句在整个方法中进行包装。
为了避免垃圾收集,您可以这样做:在内存中设置对象,然后向该对象添加值。
List<ArchiveProcess> query;
using (ArchiveVMADDatabase.ArchiveDatabaseModel dataContext = new ArchiveDatabaseModel())
{
query = (from history in dataContext.ArchiveProcess.AsNoTracking()
orderby history.ArchiveBegin descending
select history).Take(10).ToList();
return query; /// you do not really need to all enumerable as IOrderedEnumerable<ArchiveProcess>;
}发布于 2016-03-08 13:33:52
using (ArchiveVMADDatabase.ArchiveDatabaseModel dataContext = new ArchiveDatabaseModel())
{
var query = dataContext.ArchiveProcess.AsNoTracking().Take(10).OrderBy(o=> o.ArchiveBegin);
return query;
}https://stackoverflow.com/questions/35854879
复制相似问题