LINQ&多对多的关系

时间:2011-04-27 21:53:48

标签: c# linq entity-framework many-to-many

所以我正在写一个“动态”的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;
}

3 个答案:

答案 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)));
}