【问题标题】:LINQ & Many to Many RelationshipsLINQ 和多对多关系
【发布时间】:2011-04-27 21:53:48
【问题描述】:

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

桌车: Id int PK, 模型 varchar(50), 年份int

表格颜色: 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;
}

【问题讨论】:

  • 代码在 cmets 中,如果您愿意阅读的话。
  • 感谢您澄清如此明显的事实(不是)
  • 不客气。总是乐于帮助那些难以跟上的人。 :)
  • 我总是很乐意帮助各种挑战者 :)
  • @Scott,我认为@Carnotaurus 是对的——评论中的问题很难注意到。可能应该把问题放在正文之外。

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


【解决方案1】:

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

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 子句,因此您无需在此处支付任何性能损失。

【讨论】:

  • 接受解释,所以我不必接受我自己的答案。 :)
【解决方案2】:
   query = query.Where(x => options.Colors.Contains(x.ColorID))

【讨论】:

  • ColorId 在该实体中不存在。它在查找表中(即多对多)。没有单一的 ColorId 属性。
【解决方案3】:

回答了我自己的问题...

if (options.Colors.Count > 0) 
{
    query = query.Where(x => x.CarsXColors.Any(y => options.Colors.Contains(x.Id)));
}

【讨论】:

  • 应该是Contains(y.Id)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多