NHibernate и EF, выполнить запрос вне контекста? - PullRequest
2 голосов
/ 08 декабря 2011

Я знаю, что это сумасшедшая вещь, которую нужно спросить ... но я сделаю попытку :) В любом случае можно создать свой 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 ... или с обоими из них?*

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Уловка , а не , чтобы избавиться от 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 в типы, которые хотят его использовать. Вы можете использовать это, используя технику, которая называется Dependency Injection.

0 голосов
/ 08 декабря 2011

У меня сложилось впечатление, что будет работать, , если ваш тип возврата из TestRepo() был установлен вместо IQueryable<ApplicationEntity>.Я хотел бы, чтобы это продемонстрировало иначе: / / Похоже, я делал что-то подобное раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...