我已經看到關於這個問題的多個問題,但是他們是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)外,它完全一樣。
我會說(在EF 4.1和更小的至少),2個查詢方式仍然是最好的。 –
@RaphaëlAlthaus,不能相信在4個版本之後,這個問題仍然沒有得到解決......我認爲這是Web開發和SQL最根本的問題之一。無論如何,也許別人會有不同的解決方案。如果沒有,我必須堅持2個查詢暫時... – walther