我正在学习实体框架并撞墙。这是我的代码:
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>
,其中包含我想要的十个结果。但是,只要我退出方法并处理上下文,query
就会变为空。我怎么能避免这个?我尝试这样做:
select new ArchiveProcess
{
ArchiveBegin = history.ArchiveBegin,
ArchiveEnd = history.ArchiveEnd,
DeploysHistoryCount = history.DeploysHistoryCount,
MachinesHistory = history.MachinesHistory,
ScriptHistory = history.ScriptHistory
}
但后来我收到了NotSupportedException
。为什么实体框架会在处理上下文后立即删除我的宝贵实体,如何告诉它停止?
答案 0 :(得分:1)
我认为有几种方法可以避免这种情况,但一般来说,您应该准确了解您希望上下文生存多长时间。通常,将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>;
}
答案 1 :(得分:0)
using (ArchiveVMADDatabase.ArchiveDatabaseModel dataContext = new ArchiveDatabaseModel())
{
var query = dataContext.ArchiveProcess.AsNoTracking().Take(10).OrderBy(o=> o.ArchiveBegin);
return query;
}
答案 2 :(得分:0)
query as IOrderedEnumerable<ArchiveProcess>;
query
是List<ArchiveProcess>
,as
返回null
,当您尝试将其投射到其未实现的界面时。 List<ArchiveProcess>
不是IOrderedEnumerable<ArchiveProcess>
,因此query as IOrderedEnumerable<ArchiveProcess>
为null
。
IOrderedEnumerable<T>
IEnumerable<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>
。