在EFCORE中的单个LINQ查询中获得2个前5个



我想加载10个最新产品,其中包含A类A和5类。因此,结果包含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团队已经确认,联合,concat,concat,and Intersect的翻译将添加到EF Core 3中。因此,如果您使用的是EF Core 3预览,那么祝您好运,否则,如果您想拍摄一张镜头,则必须使用RAW SQL查询。

在linq查询中类似的东西应该有效:

 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();

最新更新