Dot-Net
IQueryable<> 來自儲存過程(實體框架)
我想
IQueryable<>在執行儲存過程時得到結果。這是一段執行良好的程式碼:
IQueryable<SomeEntitiy> someEntities; var globbalyFilteredSomeEntities = from se in m_Entities.SomeEntitiy where se.GlobalFilter == 1234 select se;我可以使用它來應用全域過濾器,然後使用結果如下:
result = globbalyFilteredSomeEntities .OrderByDescending(se => se.CreationDate) .Skip(500) .Take(10);我想要做的 - 在全域過濾器中使用一些儲存過程。
我試過:
將儲存過程添加到
m_Entities,但它會IEnumerable<>立即返回並執行 sp:var globbalyFilteredSomeEntities = from se in m_Entities.SomeEntitiyStoredProcedure(1234);使用 EFExtensions 庫實現查詢,但它是
IEnumerable<>.如果我使用
AsQueryable()andOrderBy(),Skip(),Take()之後
ToList()執行該查詢 -我得到
DataReader打開的異常,我需要先關閉它(無法粘貼錯誤 - 它是俄語)。var globbalyFilteredSomeEntities = m_Entities.CreateStoreCommand("exec SomeEntitiyStoredProcedure(1234)") .Materialize<SomeEntitiy>(); //.AsQueryable() //.OrderByDescending(se => se.CreationDate) //.Skip(500) //.Take(10) //.ToList();也只是跳過
.AsQueryable()沒有幫助 - 同樣的例外。當我將
ToList()查詢執行時,但是沒有
Skip(),執行查詢太昂貴了Take()。
你不能做你想做的事,因為你不能把儲存過程放在 SELECT 查詢的 FROM 子句中 - SQL 不是為支持這種操作而建構的。
你能把你想要的邏輯放到視圖中而不是儲存過程中嗎?
您可以使用我創建的一個名為LinqToAnything的項目,它允許您採用不可查詢的數據訪問方法並將其轉換為 IQueryable。
我在這裡有一篇關於如何使用它的部落格文章。