LINQ与多对多关系

Sco*_*ott 5 c# linq many-to-many entity-framework

所以我正在写一个"动态"的Linq查询.我创建了一个"选项"类,它包含可以作为查询一部分的所有动态选项.其中一些选项属性是List对象,它包含我想要返回的实体的ID,这些实体是SQL Server中多对多关系的一部分.一个快速的代码示例和表的描述可能会有所帮助(为了简洁起见,严重减少).

Table Cars: Id int PK,Model varchar(50),Year int

表颜色: Id int PK,名称varchar(50)

表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;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ung 3

我看到你已经得到了答案,但也要考虑这个替代方案:

var query = 
    from car in ctx.Cars 
    where options.Colors.Count <= 0 || car.CarsXColors.Any(y => options.Colors.Contains(y.Id))
    select car;
Run Code Online (Sandbox Code Playgroud)

这种风格很常见,因为它始终生成相同的 SQL 语句,以便数据库引擎或 LINQ 实际上可以缓存查询和/或查询计划以实现更快的响应。

如果 options.Colors 为空,数据库查询优化器将自动消除 WHERE 子句,因此您无需为此付出任何性能损失。