2013-04-02 32 views
17

Tôi có lỗi lạ trong khi tôi đang cố gắng để xem kết quả của sqlquery:Entity Framework liệt kê sqlquery kết quả

var sql = "SELECT @someParam"; 
var someParamSqlParameter = new SqlParameter("someParam", "Some Value"); 
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter); 
var containsAnyElements = result.Any(); 

Vì vậy, khi gỡ lỗi là ở dòng cuối cùng và khi tôi cố gắng mở rộng Xem kết quả của kết quả nó cho thấy tôi dự kiến ​​result("Some Value") nhưng cách gọi dòng cuối cùng tôi nhận được một ngoại lệ

"The SqlParameter đã được chứa bởi một SqlParameterCollection.".

Dường như khi tôi cố gắng để mở Result Xem các kết quả nó gọi truy vấn này một lần nữa. Nếu hành vi đó đúng không? Nếu có, vui lòng giải thích lý do tại sao điều đó xảy ra.

Trả lời

35

Dường như khi tôi cố gắng để mở Result Xem kết quả nó gọi truy vấn này một lần nữa

Bạn đang hoàn toàn đúng - bạn đang nhìn thấy những ảnh hưởng của Deferred Execution

Database.SqlQuery<T> trả về một IEnumerable<T> thực sự là đối tượng thuộc loại:

System.Data.Entity.Internal.InternalSqlQuery<T> 

Vì vậy, result của bạn đối tượng thực sự chỉ là một mô tả của truy vấn - không phải là kết quả truy vấn.

Truy vấn SQL chỉ thực sự được thực hiện trên cơ sở dữ liệu khi bạn cố xem kết quả truy vấn.

Điều bạn đang thấy đang diễn ra hai lần: một lần khi mã của bạn gọi .Any() và một lần khi trình gỡ lỗi liệt kê tập hợp kết quả.


Bạn có thể khắc phục điều này bằng cách nói một cách rõ ràng EF khi để chạy các truy vấn với .ToList():

var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter).ToList(); 

Loại result tại là List<string> và nó chứa các kết quả của truy vấn của bạn.

+0

Giải thích tuyệt vời. Cảm ơn bạn rất nhiều vì câu trả lời quá nhanh và rõ ràng. – Vladimirs

+0

Bạn đời tuyệt vời. Tôi đã phát điên, và tất cả các câu trả lời khác với cùng một chủ đề không phải là sự giúp đỡ nào. – alessalessio

+2

Tôi không thể cho cuộc sống của tôi tìm ra cách vấn đề này tạo ra thông báo lỗi đã được báo cáo. –