2014-10-01 11 views
7

Có điều gì đó có thể trả lại IQueryable cho truy vấn sql động trong Entity Framework 6 không?Sử dụng SqlQuery để nhận IQueryable

Đây là những gì tôi đang sử dụng ngay bây giờ nhưng nó đang kéo tất cả các bản ghi (như mong đợi).

DbContext.Database.SqlQuery<T>("SELECT * FROM dbo.SomeDynamicView") 

Vấn đề là SqlQuery trả về DbRawSqlQueryIEnumerable.

dbo.SomeDynamicView là chế độ xem cơ sở dữ liệu được tạo khi chạy.

+0

Ý anh là gì bởi "truy vấn sql năng động"? –

+1

Truy vấn SQL động .. SELECT * FROM SomeTable1 hoặc SELECT * FROM SomeTable2. – Oxon

Trả lời

11

Không, bạn không thể có được một IQueryable từ SqlQuery*, đây là bởi vì những gì IQueryable đang làm là xây dựng một chuỗi SQL động dựa trên những gì lựa chọn và nơi bộ lọc mà bạn đưa vào. Bởi vì trong SqlQuery bạn đang cung cấp string Entity Framework không thể tạo chuỗi động đó.

lựa chọn của bạn là một trong hai động xây dựng chuỗi tự của bạn để vượt qua trong để SqlQuery và sử dụng nó như một IEnumerable thay vì một IQueryable hoặc sử dụng một DbSet trong DbContext của bạn và làm nhiều hơn "bình thường" cách để cho khuôn khổ tổ chức xây dựng truy vấn cho bạn.


* Bạn về mặt kỹ thuật có thể bằng cách gọi AsQueryable() vào kết quả, nhưng đó chỉ là một giả vờ IEnumerable là một IQueryable, nó không cung cấp cho bạn bất kỳ trong những lợi ích của việc sử dụng một "Real" IQueryable như chỉ lấy các hàng cần thiết từ máy chủ.

+8

Cách "bình thường" chỉ có thể thực hiện được nếu tôi làm những việc đơn giản. Không phải mọi thứ trong phát triển phần mềm đều thẳng thắn. Dù sao đi nữa. Cảm ơn câu trả lời ít nhất bây giờ tôi biết rằng tôi không thể có được IQueryable từ một truy vấn SQL. – Oxon

+1

@ 1576573987 Tôi nghĩ rằng bạn đang rơi vào [Vấn đề XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), tôi đề nghị bạn hỏi một câu hỏi mới giải thích lý do tại sao bạn nghĩ rằng cách "bình thường" sẽ không hoạt động và hỏi xem có cái gì đó mà bạn đang bỏ lỡ để nó hoạt động không. –

+0

@ScottChamberlain Tôi đã thử công việc xung quanh và nó tăng [this] (https://msdn.microsoft.com/en-us/data/dn313107) ngoại lệ (khi gọi 'ToArrayAsync'), tôi trả lại nó là' IAsyncEnumerable ', có thể được điều khiển bằng cách sử dụng phương thức exetension' System.Linq.AsyncEnumerable'. – Shimmy

-9

Có Bạn có thể như sau:

DbContext.Database.SqlQuery("SELECT * FROM dbo.SomeDynamicView").AsQueryable<T>() 
+4

Điều gì sẽ xảy ra nếu bạn có mười triệu hàng trong dbo.SomeDynamicView? EF sẽ nhận được tất cả mười triệu hàng trước khi nó sẽ đến phần AsQueryable (). – Oxon

+0

Ít nhất nó hoạt động cho tôi :) – Aliove

+4

Có, nó sẽ hoạt động. Nó sẽ trả lại cho bạn một Queryable nhưng nó không phải là những gì tôi muốn. Tôi muốn thực hiện hoãn lại. Trong ví dụ của bạn, bạn đã thực thi truy vấn trước khi bạn truy cập vào phần có thể truy vấn. Mà về cơ bản giết chết toàn bộ ý tưởng của Queryable trong trường hợp này. – Oxon

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