结果IOrderedEnumerable在上下文之外为空

时间:2016-03-07 21:57:26

标签: c# entity-framework linq entity-framework-6

我正在学习实体框架并撞墙。这是我的代码:

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>;
    }
}

当我单步执行此代码时,queryList<ArchiveProcess>,其中包含我想要的十个结果。但是,只要我退出方法并处理上下文,query就会变为空。我怎么能避免这个?我尝试这样做:

select new ArchiveProcess
{
    ArchiveBegin = history.ArchiveBegin,
    ArchiveEnd = history.ArchiveEnd,
    DeploysHistoryCount = history.DeploysHistoryCount,
    MachinesHistory = history.MachinesHistory,
    ScriptHistory = history.ScriptHistory
}

但后来我收到了NotSupportedException。为什么实体框架会在处理上下文后立即删除我的宝贵实体,如何告诉它停止?

3 个答案:

答案 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>;

queryList<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>