[英]Getting COUNT and SKIP TAKE in one operation with Linq to Entities
我在 Linq to Entities 支持的數據訪問層中有一個數據調用,旨在進行分頁調用。
這樣做時,我需要選擇數據的一個子集,比如 50 行,但還要獲取所有匹配項的計數,以了解有多少總匹配項需要分頁。
目前,我正在執行以下操作:
var queryResult = DatabaseContext.Table
.Where(x => !x.IsDeleted)
.Where(p => (
p.PropertyOne.ToLower().Contains(query) ||
p.PropertyTwo.ToLower().Contains(query)
));
int count = queryResult.Count();
var returnData = queryResult
.OrderBy(i => i.ID)
.Skip(start).Take((length))
.Select(y => new ObjectDTO
{
PropertyOne = y.PropertyOne,
PropertyTwo = y.PropertyTwo
}
.AsEnumerable();
這會導致兩個代價高昂的數據庫操作。 由於某種原因, COUNT
操作實際上比SELECT
操作花費的時間更長。
有沒有辦法在同一操作中獲取計數和子集?
對我來說,邏輯流程表明我們執行以下操作:
這在一次操作中似乎是可能的,但我不知道如何。
嘗試一,慢
嘗試了 D Stanley 將完整結果集轉換為List
並在分頁中進行計數和內存的建議,但它的速度大約慢了 2 倍(平均 6.9 秒 vs 平均 3.9 秒)
值得一提的是,該數據集大約有 25,000 條記錄,在 JOIN 中搜索了十幾個相關表。
這可能是可能的,但由於您使用的標准,它可能不會更快。 由於您要在列值中搜索文本,因此不能使用索引,因此必須進行表掃描。 您可以執行單個查詢來獲取所有記錄並在 linq-to-objects 中執行Count
和Skip/Take
:
var queryResult = DatabaseContext.Table
.Where(x => !x.IsDeleted)
.OrderBy(i => i.ID)
.Where(p => (
p.PropertyOne.ToLower().Contains(query) ||
p.PropertyTwo.ToLower().Contains(query)
))
.ToList();
int count = queryResult.Count(); // now this will be a linq-to-objects query
var returnData = queryResult
.Skip(start).Take((length))
.AsEnumerable();
但是您必須嘗試一下,看看它是否會更快。
像這樣的東西怎么樣:
db.Products
.Take(10)
.Select(p => new
{
Total = db.Products.Count,
Product = p
})
如果這不好,了解在 SQL 中使用 OVER() 獲得總結果和其中一頁可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.