构建 IQueryable,包括基于条件的附加表

Build up IQueryable including additional tables based on conditions

我有一个问题,我们创建了一个复杂的 IQueryable,我们需要提高它的效率。

有 2 个 table 只有在过滤其中的列时才应包括在内。

我的具体情况很难解释,所以我想我可以用汽车的例子来说明。

如果我有这样的 CarFilter class:

public class CarFilter
{
    public string BrandName { get;set; }
    public decimal SalePrice {get; set; }
}

假设我们有一个汽车销售查询:

var info = from car in cars
           from carSale in carSales on carSale.BrandId == car.BrandId && car.ModelId == carSale.ModelId
           from brand in carBrands on car.BrandId == brand.BrandId
           select car

 var cars = info.ToList();

假设这是一个巨大的查询 returns 100'000 行,因为我们正在查看汽车和销售以及相关品牌。

用户只想查看汽车的详细信息,其他 2 table 用于过滤目的。

所以如果用户只想看福特汽车,我们上面的逻辑是没有效率的。我们无缘无故地 table 加入了巨大的汽车销售,以及 CarBrand 因为用户不关心那里的任何东西。

我的问题是,如果确实需要 table,我如何才能只在我的 IQueryable 中包含它们?

因此,如果我的过滤器中有 BrandName,我将包括 CarBrand table,如果没有,则不包括。

使用这个例子,我唯一想要两个 table 的情况是用户同时指定了 BrandNameSalePrice

语义在这里并不重要,即返回的记录数受连接等影响,我正在寻求有关方法的帮助

我正在使用 EF Core

保罗

复杂过滤很常见。需要的时候就加入。

var query = cars;

if (filter.SalePrice > 0)
{
    query =  
        from car in query
        join carSale in carSales on new { car.BrandId, car.ModelId } equals new { carSale.BrandId, carSale.ModelId }
        where carSale.Price >= filter.SalePrice
        select car;
}

if (!filter.BrandName.IsNullOrEempty())
{
    query = 
        from car in query
        join brand in carBrands on car.BrandId equals brand.BrandId
        where brand.Name == filter.BrandName
        select car;
}

var result = query.ToList();