簡體   English   中英

在EFCore中的單個LINQ查詢中獲得2個前5個

[英]Getting 2 Top 5 within a single LINQ query in EFCore

我想加載10個最新產品,其中包含5個A類和5個B類。所以結果包含5個類別A的最新產品和5個類別B的最新產品。

通常我可以用這兩個來做:

var listA = await (
    from p in db.Set<Product>()
    where p.Category == "A"
    orderby p.ProductDate descending
    select p
).Take(5).ToListAsync();

var listB = await (
    from p in db.Set<Product>()
    where p.Category == "B"
    orderby p.ProductDate descending
    select p
).Take(5).ToListAsync();

var result = listA.Concat(listB);

但正如您所看到的那段代碼需要2次調用數據庫。

如何只使用1個數據庫調用即可獲得結果?

await之前使用Concat

var listA = (
    from p in db.Set<Product>()
    where p.Category == "A"
    orderby p.ProductDate descending
    select p
).Take(5);

var listB = (
    from p in db.Set<Product>()
    where p.Category == "B"
    orderby p.ProductDate descending
    select p
).Take(5);

var result= await listA.Concat(listB).ToListAsync();

使用EF Core 3.0.0-preview7.19362.6,您可以像這樣編寫它,它只生成一個查詢並且工作得很好:

IQueryable<Product> topA = context.Products
    .Where(p => p.Category == "A")
    .OrderByDescending(x => x.ProductDate)
    .Take(5);

IQueryable<Product> topB = context.Products
    .Where(p => p.Category == "B")
    .OrderByDescending(x => x.ProductDate)
    .Take(5);

List<Product> result = await topA
    .Concat(topB)
    .OrderBy(p => p.Category)
    .ToListAsync();

最近,EF團隊已確認 UNION,CONCAT,EXCEPT和INTERSECT的翻譯將被添加到EF Core 3.所以,如果你使用的是EF Core 3 Preview,那么祝你好運,否則你必須使用RAW SQL查詢你想一次性去。

在LINQ Query這樣的東西應該工作:

 var list = await(db.Product.Where(p => p.Category == "A" || p.Category == "B").OrderByDescending(p => p.ProductDate)
                                .ToList()
                                .GroupBy(p => p.Category)
                                .SelectMany(t => t.Select(b => b).Zip(Enumerable.Range(0, 5), (j, i) => j))).ToListAsync();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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