2011-02-08 21 views
7

Trong một trang web, nếu tôi có một lớp:Truy vấn được biên dịch phải biên dịch bao nhiêu lần trong vòng đời của một ứng dụng?

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

Trong một trang tôi có:

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

bao nhiêu lần so với truy vấn sẽ được biên dịch? Mỗi khi trang tải ...? Một lần trong ứng dụng ...?

+0

@Martinho Fernandes: Đó chỉ là một nửa câu hỏi ... Bạn (sai) giả sử OP không biết các trường tĩnh hoạt động như thế nào trong ASP.NET. – leppie

+0

Có vẻ như bạn đã nhận được câu trả lời cho câu hỏi này trong câu trả lời cho [câu hỏi cuối cùng của bạn] (http://stackoverflow.com/questions/4932594/when-should-i-use-a-compiledquery). Bạn đang cố hỏi gì khác ở đây? –

+0

@Cody Gray, chỉnh sửa đẹp! Cảm ơn bạn! :) – BrunoLM

Trả lời

1

Thấy nó được biên dịch. Tôi sẽ nói một lần. Tại sao nó cần phải được biên dịch lại? Đó không phải là điểm của các truy vấn được biên dịch sao?

Với truy vấn được biên dịch là tĩnh, một lần cho mỗi phiên bản ứng dụng/suốt đời. Lưu ý: Thời gian tồn tại có thể trùng lặp.

4

vì đó là thành viên tĩnh, một khi lớp học được tải trong miền ứng dụng.

1

Tôi muốn nói một lần cho mỗi AppDomain, vì đó là biến tĩnh.

-1

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

"Các thành viên tĩnh được khởi tạo trước khi các thành viên tĩnh được truy cập lần đầu tiên, và trước khi các nhà xây dựng tĩnh, nếu có được gọi."

Vì vậy, nó sẽ biên dịch nhiều nhất mỗi khi trang được tải. Vì lớp của bạn không có một hàm tạo tĩnh nên nó không nên biên dịch cho đến khi bạn thực sự truy cập thành viên tĩnh. (Theo MSDN.)

Tuy nhiên, điều đó có biên dịch không? Dường như bạn đang cố tải một thành viên tĩnh từ một lớp đã được khởi tạo.

+0

constructor tĩnh là không bắt buộc. điểm khác là hợp lệ –

+0

Tôi không nói nó là bắt buộc. Tôi nói anh ta không có. Và theo tài liệu, điều đó có nghĩa là nó không thiết lập các trường tĩnh cho đến khi chúng được sử dụng. – William

1

Nếu bạn xác định truy vấn AllTags theo cách này, nó sẽ chỉ được biên dịch một lần. Kiểm tra điều này blog post về các truy vấn được biên dịch trong các ứng dụng web và dịch vụ web của Julie Lerman.

Các vấn đề liên quan