在不同的DbContext实例上重新执行IQueryable? [英] Reexecuting IQueryable on different DbContext instance?

查看:256
本文介绍了在不同的DbContext实例上重新执行IQueryable?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个封装 DbContext 的存储库层。
我想公开一个流畅的界面来构建查询,并且在发送查询请求后每次处理并创建一个新的 DbContext

I'm creating a repository layer to encapsulate DbContext. I would like to expose a fluent interface for building query, and dispose and create a new DbContext every time after a query request is sent:

var repo = new EntityRepository();

repo = EntityRepository.FilterByAge(30).FilterByGender("Male");
var people = repo.GetPeople();
  // GetPeople() should send the request, get the result, then dispose
  // the old DbContext and create a new one

repo = repo.FilterByOccupation("Programmer");
var programmers = repo.GetPeople();
  // the age and gender filters should still apply here

目前在我的 EntityRepository ,我有一个私人的 DbContext 和一个 IQueryable 。在Filter方法中,我将Linq方法附加到 IQueryable 上。然后在完成请求后,我做:

Currently in my EntityRepository, I have a private DbContext and a IQueryable. In the Filter methods, I append the Linq methods onto the IQueryable. Then after finishing a request, I do:

db.Dispose();
db = new EntityContext();

但是,当我尝试执行其他请求时,这不行。它表示 DbContext 已被处理。

But this does not work when I try to do another request. It says the DbContext has been disposed.

如何保持相同的查询新的$ $ $ c> DbContext ?

How do I keep the same query for a new DbContext?

推荐答案

我最后保留了一个过滤器列表,这是匿名的 IQueryable 并返回 IQueryable 的函数。然后我将它们应用于短暂的 DbContext

I ended up keeping a list of "filters", which are anonymous functions that takes in IQueryable and return IQueryable. Then I apply them on a short-live DbContext :

存储库: p>

Repository:

private IList<Func<IQueryable<Person>, IQueryable<Person>>> filters;

public Repository FilterByAge(int age)
{
    var _filters = new List<Func<IQueryable<Person>, IQueryable<Person>>>(filters);
    _filters.Add(q => q.Where(e => e.Age == age));
    return new Repository(_filters);
}

public Repository OrderByName()
{
    var _filters = new List<Func<IQueryable<Entity>, IQueryable<Entity>>>(filters);
    _filters.Add(q => q.OrderBy(e => e.Name));
    return new Repository(_filters);
}

private IQueryable<Person> ApplyFilters(AppContext db)
{
    var result = db.People;
    foreach (var filter in filters)
    {
        result = filter(result);
    }
    return result;
}

public IEnumerable<Person> GetPeople()
{
    IEnumerable<Person> people;
    using (var db = new AppContext())
    {
        people = ApplyFilters(db).ToList();
    }
    return people;
}

使用

private Repository repo = new Repository();

var peopleOfThirty = repo.FilterByAge(30);
var orderedByName = peopleOfThirty.OrderByName();

if (wantOrder)
{
    return peopleOfThirty.GetPeople();
}
else
{
    return orderedByName.GetPeople();
}

它适用于我的目的。但是,如果这样做有问题请通知我。谢谢!

It works for my purposes. However, please let me know if there is any problem doing it this way. Thanks!

这篇关于在不同的DbContext实例上重新执行IQueryable?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆