【问题标题】:Linq to Entities .net4 EFLinq to Entity .net4 EF
【发布时间】:2011-01-28 00:10:24
【问题描述】:

我有 Bikes、Seats 和 BikeSeats 桌子。 BikeSeats 是映射器表,来自 BikeID 和 SeatID 的复合键,其中没有其他列。

所有这些都映射到 EF、.net 4 中,仅适用于 Bike、Seat(以及 bike.Seats 和 seat.Bikes)

我想获得红色自行车应有的所有座椅类型:

    select distinct s.* 
    from seats s
          left join bikeSeats bs on s.seatID = bs.seatId
    where bs.bikeId in (select distinct bikeId from bikes where color=red)

使用 Linq 到实体

对我来说真正困难的部分是 BikeSeats 不存在,它基本上被映射到 bike.Seats 和/或 seat.Bikes(EF 这样做是因为该表只有 2 个 id)

任何转换此查询的帮助将非常感激

谢谢 --MB

【问题讨论】:

  • 仅供参考:我将问题编辑为说 LINQ to Entities 而不是 LINQ to SQL,因为 OP 表明他正在使用实体框架。

标签: .net entity-framework linq-to-entities


【解决方案1】:

小学,我亲爱的 Boisson:

var seatsOnRedBikes = ctx.Seats.Where(s => s.Bikes.Any(b => b.Color == "Red"));

【讨论】:

  • 这个查询看起来像天才的作品,你甚至在称呼我亲爱的时候侮辱我!那是天才。我显然在 linq 中遗漏了一些东西。有一些评论让我很困惑,但它消失了。另外,没有明显的区别,但它以某种方式起作用....再次感谢
  • @Massive Boisson - 我删除了我的答案并对此表示赞同,因为这是正确的(而我的不是)。当您想要检索关系中的所有相关记录时(如 LEFT OUTER JOIN,没有过滤器),需要预先加载。但由于他在这里过滤,因此不需要,EF 将“解决”所需的内容。
  • @Massive Boisson:无意侮辱:我只是想指出,当它应该很简单时,想出一些非常复杂的东西来解决这样的问题是很诱人的。这是“我想要所有自行车都以“红色”为颜色的所有座位的直接翻译。” Distinct 不是必需的,因为首先 ctx.Seats 只会为每个座位返回一排。急切的获取 cmets 使问题过于复杂,因此您可以忽略它们。
【解决方案2】:

首先必须声明您的实体实例,我不知道您的实体名称是什么,例如说它是 BikeSeatEntity

List<Seat> GetSeats()
        {
            using (BikeSeatEntity bsEntity = new BikeSeatEntity())
            {
                var seats = from s in bsEntity.Seats.Include("Bikes").Where(s => s.Bike.Color = "Red")
                            select s;
                List<Seat> seatsList = seats.ToList();
                return seatsList;
            }
            return null;
        }

如果这不适合您,请详细描述您的实体。

【讨论】:

  • s =&gt; s.Bikes =&gt; s.Bikes,这是一个集合,所以在上面执行 .Color 是行不通的。
猜你喜欢
  • 2019-06-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2012-11-15
  • 2011-04-28
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多