构建 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 的情况是用户同时指定了 BrandName
和 SalePrice
。
语义在这里并不重要,即返回的记录数受连接等影响,我正在寻求有关方法的帮助
我正在使用 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();
我有一个问题,我们创建了一个复杂的 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 的情况是用户同时指定了 BrandName
和 SalePrice
。
语义在这里并不重要,即返回的记录数受连接等影响,我正在寻求有关方法的帮助
我正在使用 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();