Dot-Net

IQueryable<> 來自儲存過程(實體框架)

  • June 27, 2019

我想IQueryable&lt;&gt;在執行儲存過程時得到結果。

這是一段執行良好的程式碼:

IQueryable&lt;SomeEntitiy&gt; someEntities;  
var globbalyFilteredSomeEntities = 
 from se in m_Entities.SomeEntitiy
   where
     se.GlobalFilter == 1234 
 select se;

我可以使用它來應用全域過濾器,然後使用結果如下:

result = globbalyFilteredSomeEntities
 .OrderByDescending(se =&gt; se.CreationDate)
 .Skip(500)
 .Take(10);

我想要做的 - 在全域過濾器中使用一些儲存過程。

我試過:

將儲存過程添加到m_Entities,但它會IEnumerable&lt;&gt;立即返回並執行 sp:

var globbalyFilteredSomeEntities = 
 from se in m_Entities.SomeEntitiyStoredProcedure(1234);

使用 EFExtensions 庫實現查詢,但它是IEnumerable&lt;&gt;.

如果我使用AsQueryable()and OrderBy(), Skip(),Take()

之後ToList()執行該查詢 -

我得到DataReader打開的異常,我需要先關閉它(無法粘貼錯誤 - 它是俄語)。

var globbalyFilteredSomeEntities = 
 m_Entities.CreateStoreCommand("exec SomeEntitiyStoredProcedure(1234)")
           .Materialize&lt;SomeEntitiy&gt;();
           //.AsQueryable()
           //.OrderByDescending(se =&gt; se.CreationDate)
           //.Skip(500)
           //.Take(10)
           //.ToList();   

也只是跳過.AsQueryable()沒有幫助 - 同樣的例外。

當我將ToList()查詢執行時,

但是沒有Skip(),執行查詢太昂貴了Take()

你不能做你想做的事,因為你不能把儲存過程放在 SELECT 查詢的 FROM 子句中 - SQL 不是為支持這種操作而建構的。

你能把你想要的邏輯放到視圖中而不是儲存過程中嗎?

您可以使用我創建的一個名為LinqToAnything的項目,它允許您採用不可查詢的數據訪問方法並將其轉換為 IQueryable。

我在這裡有一篇關於如何使用它的部落格文章。

引用自:https://stackoverflow.com/questions/2772295