簡體   English   中英

使用 Linq to Entities 在一次操作中獲取 COUNT 和 SKIP TAKE

[英]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 中執行CountSkip/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM