7

在一个网站上,如果我有一堂课:

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();
}

查询将被编译多少次?每次页面加载...?一旦进入应用程序......?

4

5 回答 5

4

因为它是一个静态成员,所以当类在应用程序域中加载时。

于 2011-02-08T12:09:46.983 回答
1

如果您以这种方式定义 AllTags 查询,它将只编译一次。查看Julie Lerman 撰写的关于 Web 应用程序和 Web 服务中的编译查询的博客文章。

于 2011-02-08T12:12:59.890 回答
1

看到编译好了。我会说一次。为什么需要重新编译?这不是编译查询的重点吗?

鉴于编译的查询是静态的,每个应用程序实例/生命周期一次。注意:生命周期可能重叠。

于 2011-02-08T12:09:37.013 回答
1

我会说每个 AppDomain 一次,因为它是一个静态变量。

于 2011-02-08T12:09:49.097 回答
-1

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

“静态成员在第一次访问静态成员之前初始化,并且在调用静态构造函数之前,如果有的话。”

所以每次加载页面时它最多会编译。由于您的类没有静态构造函数,因此在您实际访问静态成员之前不应编译。(根据 MSDN。)

但是,这可以编译吗?您似乎正在尝试从实例化类中加载静态成员。

于 2011-02-08T12:11:10.503 回答