NHibernate和EF,在上下文外执行查询



我知道这是一个疯狂的问题…但我会给它一个机会:)是否有任何方式建立你的linq/查询,然后以后能够建立更多,然后执行它…例如:

        public void Test()
    {
        var k = TestRepo();
        k = k.Where(e => e.SomeColumn == someValue);
        rp.DataSource = k.Select(t => t.Id);
        rp.DataBind();
    }

    public IEnumerable<ApplicationEntity> TestRepo()
    {
        using (var x = new MyEntityContext())
        {
            return from q in x.MyColumn
                   select q;
        }
    }

如果我没弄错的话,这是行不通的:)…但是,如果你首先可以"构建"查询的基础,然后扩展它,然后一旦它最终准备好,实际执行它并获得结果,这不是很好吗?那么,是否有办法像上面的EF或NHibernate的例子那样做呢?还是两者都有?

提前感谢!

技巧是不是来处理MyEntityContext。例如,您可以在请求的生命周期内缓存它,并在请求结束时将其丢弃。这可能看起来像这样:

public static class ContextFactory
{
private static bool disposeRegistered = false;
public static MyEntityContext GetContext()
{
    RegisterDispose();
    var instance = (MyEntityContext)HttpContext.Current
        .Items["MyEntityContext"];
    if (instance == null)
    {
        instance = new MyEntityContext();
        HttpContext.Current.Items["MyEntityContext"] =
            instance;
    }
    return instance;    
}
private static void RegisterDispose()
{
    if (disposeRegistered)
        return;
    HttpContext.Current.ApplicationInstance
       .EndRequest += (s,e) =>
    {
        var instance = HttpContext.Current
            .Items["MyEntityContext"] as IDisposable;
        if (instance != null)
        {
            instance.Dispose();
        }
    };
    this.disposeRegistered = true;
}
}

TestRepo方法看起来像这样:

public IQueryable<Employee> TestRepo()
{
    var x = ContextFactory.GetContext()
    return 
        from employee in x.Employees
        where employee.Salary > 1000
        select employee;
}

注意TestRepo现在如何返回IQueryable。这允许其他方法更改查询,并且只有当您开始迭代它时,查询才会被发送到数据库。

注意:除了依赖于静态ContextFactory类,你也可以将MyEntityContext注入到希望使用它的类型中。你可以使用一种叫做依赖注入的技术来使用它。

我的印象是工作,如果您的返回类型从TestRepo()被设置为IQueryable<ApplicationEntity>。-/好像我以前做过类似的事情。

最新更新