2016-02-12 12 views
5

Tôi gặp vấn đề rất đặc biệt: phương pháp mở rộng ToList() không chuyển đổi kết quả thành danh sách. đây là mã của tôi, tiêu chuẩn truy vấn soạn sẵn LINQ, tôi chuyển ToList() hai lần cho biện pháp tốtLinq ToList() không kích hoạt Thực thi ngay lập tức

var assets = new List<Asset>(); 

using (var ctx = new LeaseContext()) 
{ 
    assets = ctx.Assets.OrderBy(o => o.Reference).Where(w => w.Status == AssetStatus.Active).ToList(); 

    assets.ToList(); 
} 

return assets; 

nhưng các tài sản vẫn là một danh sách các System.Data.Entities.DynamicProxies ....

Tôi chưa bao giờ có vấn đề này trước đó.

+0

Tại sao bạn sử dụng ToList() cho cùng một biến? –

+0

'ToList()' thứ hai không làm bất cứ điều gì vì bạn không sử dụng kết quả của 'ToList()'. –

+0

Tôi biết ToList thứ hai() là dư thừa, tôi chỉ muốn thử nghiệm. – franklores

Trả lời

8

Lý do là tải chậm. Khi tải lười được bật trong EF (theo mặc định), sau đó (một lần nữa, theo mặc định) EF tạo proxy động cho từng thực thể. Nó là cần thiết để tải các thực thể liên quan. Proxy động sẽ được kế thừa từ lớp thực thể. Vì vậy, trong trường hợp của bạn, nó sẽ được kế thừa từ Asset. Nhưng proxy động sẽ có tham chiếu đến ngữ cảnh đã tạo ra cá thể của nó. Và nó sẽ ghi đè lên các thuộc tính điều hướng (là ảo) để truy vấn các thực thể thông qua ngữ cảnh được lưu trữ trong proxy động.

Và hoàn toàn hợp pháp để thêm các trường hợp của các loại có nguồn gốc vào danh sách loại cơ sở.

Nếu bạn không muốn proxy năng động, sau đó chỉ cần vô hiệu hóa tải lười biếng và tạo proxy:

ctx.Configuration.LazyLoadingEnabled = false; // turn-off loading on-demand 
ctx.Configuration.ProxyCreationEnabled = false; // turn-off wrapper class generation 

Về mặt kỹ thuật, bạn có thể chỉ cần bật tắt hệ proxy và tải lười biếng sẽ không hoạt động. Nhưng tôi muốn tắt cả hai cài đặt một cách rõ ràng.

+0

Tôi đã thêm tuyên bố, nhưng vẫn không hoạt động. sử dụng (var ctx = new LeaseContext()) \t \t \t { \t \t \t \t ctx.Configuration.LazyLoadingEnabled = false; \t \t \t \t asset = ctx.Assets.OrderBy (o => o.Reference) .Where (w => w.Status == AssetStatus.Active) .Select (x => x) .ToList(); \t \t \t} \t \t \t \t \t \t tài sản trở lại; – franklores

+0

@franklores bạn nên thêm câu lệnh này trước khi bạn sử dụng 'cxt' để truy vấn nội dung –

+0

@franklores xin lỗi, tôi đã quên cài đặt cấu hình thứ hai - có một cách riêng biệt để vô hiệu hóa việc tạo proxy –

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