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

时间:2011-12-08 14:07:56

标签: c# .net entity-framework nhibernate

我知道这是一个疯狂的问题..但是我试试看:) 反正有没有建立你的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 ..或两者都是em?

提前致谢!

2 个答案:

答案 0 :(得分:2)

诀窍是来处置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类。您可以使用称为依赖注入的技术来使用它。

答案 1 :(得分:0)

我认为工作,如果,则TestRepo()的返回类型设置为IQueryable<ApplicationEntity>。我希望它能证明: - /似乎我以前做过类似的事情。