首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结果IOrderedEnumerable外部上下文为空

结果IOrderedEnumerable外部上下文为空
EN

Stack Overflow用户
提问于 2016-03-07 21:57:26
回答 3查看 427关注 0票数 0

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

代码语言:javascript
运行
复制
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。我怎么才能避免这种情况?我试过这样做:

代码语言:javascript
运行
复制
select new ArchiveProcess
{
    ArchiveBegin = history.ArchiveBegin,
    ArchiveEnd = history.ArchiveEnd,
    DeploysHistoryCount = history.DeploysHistoryCount,
    MachinesHistory = history.MachinesHistory,
    ScriptHistory = history.ScriptHistory
}

但后来我收到了一个NotSupportedException。为什么一旦上下文被处理,实体框架就会删除我宝贵的实体,我如何让它停止呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-08 14:41:18

代码语言:javascript
运行
复制
query as IOrderedEnumerable<ArchiveProcess>;

query是一个List<ArchiveProcess>,当您尝试使用它向它没有实现的接口强制转换时,as返回nullList<ArchiveProcess>不是IOrderedEnumerable<ArchiveProcess>,所以query as IOrderedEnumerable<ArchiveProcess>null

IOrderedEnumerable<T>唯一不做的事情就是实现CreateOrderedEnumerable<TKey>,它可以直接调用,也可以通过ThenByThenByDescending调用,因此您可以在可枚举项上添加一个次要排序,该排序只影响前面的排序所认为的等价项。

如果您不直接使用CreateOrderedEnumerable(),也不通过ThenBy()ThenByDescending()使用,那么更改为不尝试使用它:

代码语言:javascript
运行
复制
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等可以与其一起使用:

代码语言:javascript
运行
复制
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>

票数 0
EN

Stack Overflow用户

发布于 2016-03-07 22:04:00

我认为有几种方法可以避免这种情况,但一般来说,你应该确切地知道你希望你的环境能活多久。通常,最好让using语句在整个方法中进行包装。

为了避免垃圾收集,您可以这样做:在内存中设置对象,然后向该对象添加值。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2016-03-08 13:33:52

代码语言:javascript
运行
复制
  using (ArchiveVMADDatabase.ArchiveDatabaseModel dataContext = new ArchiveDatabaseModel())
    {

       var query = dataContext.ArchiveProcess.AsNoTracking().Take(10).OrderBy(o=> o.ArchiveBegin);

        return query;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35854879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档