所以我正在写一个“动态”的Linq查询。我创建了一个“选项”类,它包含可以作为查询一部分的所有动态选项。其中一些选项属性是List对象,它包含我想要返回的实体的ID,这些实体是SQL Server中多对多关系的一部分。一个快速的代码示例和表格的描述可能有所帮助(为了简洁而严重减少)。
Table Cars: Id int PK, 型号varchar(50), 年份
表格颜色 Id int PK, 名称varchar(50)
Table CarsXColors: CarId int PK, ColorId int PK
public IEnumerable<Car> Search(SearchOptions options)
{
var query = from car in ctx.Cars select car;
// This works just fine
if (options.MaxMileage.HasValue) query = query.Where(x => x.Mileage <= options.Mileage.Value);
// How do I implement this pseudo code. options.Colors is a List<int>
if (options.Colors.Count > 0)
{
query = query.Where( -- select cars that are in the List<int> of colors --);
}
return query;
}
答案 0 :(得分:3)
我看到你已经得到了答案,但也考虑了这个选择:
var query =
from car in ctx.Cars
where options.Colors.Count <= 0 || car.CarsXColors.Any(y => options.Colors.Contains(y.Id))
select car;
这种风格很常见,因为它始终生成相同的SQL语句,因此数据库引擎或LINQ实际上可以缓存查询和/或查询计划,以便更快地响应。
如果options.Colors为空,数据库查询优化器将自动消除WHERE子句,因此您不会在此处支付任何性能损失。
答案 1 :(得分:2)
query = query.Where(x => options.Colors.Contains(x.ColorID))
答案 2 :(得分:0)
回答了我自己的问题......
if (options.Colors.Count > 0)
{
query = query.Where(x => x.CarsXColors.Any(y => options.Colors.Contains(x.Id)));
}