Сколько раз скомпилированный запрос должен перекомпилироваться в течение жизненного цикла приложения? - PullRequest
7 голосов
/ 08 февраля 2011

Если у меня на сайте есть класс:

public class Provider
{
    static readonly Func<Entities, IEnumerable<Tag>> AllTags =
        CompiledQuery.Compile<Entities, IEnumerable<Tag>>
        (
            e => e.Tags
        );

    public IEnumerable<Tag> GetAll()
    {
        using (var db = new Entities())
        {
            return AllTags(db).ToList();
        }
    }
}

На странице у меня есть:

protected void Page_Load(object sender, EventArgs ev)
{
    (new Provider()).GetAll();
}

Сколько раз запрос будет скомпилирован?Каждый раз, когда страница загружается ...?Один раз в приложении ...?

Ответы [ 5 ]

4 голосов
/ 08 февраля 2011

, поскольку это статический член, один раз, когда класс загружается в домен приложения.

1 голос
/ 08 февраля 2011

Если вы определите свой запрос AllTags таким образом, он будет скомпилирован только один раз.Проверьте это сообщение в блоге о скомпилированных запросах в веб-приложениях и веб-сервисах Джули Лерман.

1 голос
/ 08 февраля 2011

Я бы сказал, один раз для каждого AppDomain, поскольку это статическая переменная.

1 голос
/ 08 февраля 2011

Видя это скомпилировано.Я бы сказал один раз.Зачем его нужно перекомпилировать?Разве это не точка скомпилированных запросов?

Учитывая, что скомпилированный запрос является статическим, один раз на экземпляр / время жизни приложения.Примечание. Срок службы может совпадать.

0 голосов
/ 08 февраля 2011

http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx#Y696

"Статические члены инициализируются до того, как к статическому члену обращаются в первый раз, и до статического конструктора, если таковой вызывается."

Таким образом, он будет компилироваться максимально при каждой загрузке страницы. Так как ваш класс не имеет статического конструктора, он не должен компилироваться, пока вы на самом деле не получите доступ к статическому члену. (По данным MSDN.)

Однако, это компилируется? Похоже, вы пытаетесь загрузить статический член из экземпляра класса.

...