2012-05-23 88 views
4

我已經看到關於這個問題的多個問題,但是他們是2年(或更久)的,所以我想知道是否有任何改變。Linq-to-entities,在一個查詢中得到結果+行數

基本思想是填充gridview並創建自定義分頁。所以,我也需要結果和行數。

在SQL這將是這樣的:

SELECT COUNT(id), Id, Name... FROM ... WHERE ... 

獲得一個不錯的簡單查詢一切。但是,我想要保持一致並使用Linq2Entities。

到目前爲止,我使用兩種查詢方法(針對sql服務器),因爲它只是工作。我想優化它,並使用一個單一的查詢。

我已經試過這樣:

var query = from o in _db.Products 
         select o; 

var prods = from o in query 
      select new 
      { 
       Count = query.Count(), 
       Products = query 
      }; 

這將產生一個非常討厭的和長期的查詢與真的不必要的交叉連接和其他的東西,我並不真的需要或想要的。

有沒有辦法在一個簡單的查詢中獲得分頁結果+所有實體的數量?這裏推薦的方法是什麼?

UPDATE:

剛試過FutureQueries,要麼我做錯了什麼,或者它實際上執行兩個查詢。這說明我的SQL事件探查器:

-- Query #1 

SELECT 
[GroupBy1].[A1] AS [C1] 
FROM (SELECT 
    COUNT(1) AS [A1] 
    FROM [dbo].[Products] AS [Extent1] 
    WHERE 1 = [Extent1].[CategoryID] 
) AS [GroupBy1]; 

而下一行:

-- Query #1 

SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[Name] AS [Name], 
[Extent1].[Price] AS [Price], 
[Extent1].[CategoryID] AS [CategoryID] 
FROM [dbo].[Products] AS [Extent1] 
WHERE 1 = [Extent1].[CategoryID]; 

的C#代碼:

internal static List<Product> GetProducts(out int _count) 
{ 
    DatabaseEntities _db = new DatabaseEntities(); 

    var query = from o in _db.Products 
       where o.CategoryID == 1 
       select o; 

    var count = query.FutureCount(); 

    _count = count.Value; 
    return query.Future().ToList(); 
} 

我錯過了什麼?根據我的分析器,除了查詢中添加的行( - Query#1)外,它完全一樣。

+1

我會說(在EF 4.1和更小的至少),2個查詢方式仍然是最好的。 –

+0

@RaphaëlAlthaus,不能相信在4個版本之後,這個問題仍然沒有得到解決......我認爲這是Web開發和SQL最根本的問題之一。無論如何,也許別人會有不同的解決方案。如果沒有,我必須堅持2個查詢暫時... – walther

回答

2

查看Future Queries在EntityFramework.Extended中執行此操作。該鏈接頁面上的第二個示例使用FutureCount()來完成您想要的功能。這裏適應:

var q = db.Products.Where(p => ...); 
var qCount = q.FutureCount(); 
var qPage = q.Skip((pageNumber-1)*pageSize).Take(pageSize).Future(); 

int total = qCount.Value;  // Both queries are sent to the DB here. 
var tasks = qPage.ToList(); 
+0

只是試過了,但它似乎並沒有按照我的期望做...請看看我的更新,也許你可以解釋。 – walther

+1

@walther。不,它**應該**執行兩個查詢,這沒關係!重要的是它們是在數據庫服務器的單個發送/接收中執行的。與往返網絡延遲相比,處理數據庫中的2個查詢的時間長短。此外,如果你可以得到'SELECT COUNT(id),...'來工作,它只會給你請求頁面上的行數;我認爲你需要記錄匹配整個查詢的次數,但是你只需要一個實際記錄的子集(單個頁面)。這是查詢總數+一頁記錄的推薦方法。 –

+0

是的,我明白了......儘管有一種方法使用原始的sql來使它成爲一個查詢,但我認爲這是使用linq最好的方法。謝謝。 – walther

相關問題