linq 执行拆分查询时,Include()不与Take()一起使用

ia2d9nvy  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(175)

我在我的产品类中收集了图像:

public ICollection<Image> Images { get; set; } = null!;

字符串
我遇到的问题,图像不包括当我试图采取只有4个第一产品。此代码包括图像

var products = await _context.Products
            .Include(x => x.Images)
            .AsSplitQuery()
            .ToListAsync();


但这并不包括他们

var products = await _context.Products
            .Take(4)
            .Include(x => x.Images)
            .AsSplitQuery()
            .ToListAsync();


This is SQL generated with Take
This is without Take
当我包含其他实体时,图像也被包含在内。例如,我在Product类中有Brand字段

public int BrandId { get; set; }
public Brand Brand { get; set; } = null!;


此代码包括品牌和图像

var products = await _context.Products
            .Take(4)
            .Include(x => x.Images)
            .Include(x => x.Brand)
            .AsSplitQuery()
            .ToListAsync();


为什么使用Take方法时不包含图像?我可以更改为单个查询或使用Select()指定我需要获取的内容,它将工作。但是我想知道拆分查询的问题是什么。我使用PostgreSQL作为数据库。

ffx8fchx

ffx8fchx1#

Include()之前使用Take()时,EF Core会生成一个包含LIMIT子句的SQL查询,以便仅提取指定数量的产品。但是,当EF Core拆分查询并为相关实体执行单独的查询时,它不会在这些查询中包含LIMIT子句。
您可以尝试删除AsSplitQuery() =>

var products = await _context.Products
    .Take(4)
    .Include(x => x.Images)
    .ToListAsync();

字符串
或者
拆分查询=>

var products = await _context.Products
    .Take(4)
    .ToListAsync();

foreach (var product in products)
{
    await _context.Entry(product)
        .Collection(x => x.Images)
        .LoadAsync();
}

z8dt9xmd

z8dt9xmd2#

EF Core正在生成一个包含LIMIT子句的SQL查询,以仅获取指定数量的产品。但是,当EF Core拆分查询并为相关实体执行单独的查询时,它不会在这些查询中包含LIMIT子句。这种使用可以清楚地看到在生成的查询。
如果满足您的要求,您可以使用拆分查询。

var products = await _context.Products
    .Take(4)
    .Include(x => x.Images)
    .ToListAsync();

字符串
也可以运行单独的查询。

相关问题