【问题标题】:Eager loading child lists in LINQ to SQL渴望在 LINQ to SQL 中加载子列表
【发布时间】:2010-08-16 11:33:47
【问题描述】:

我正在尝试优化 LINQ to SQL 请求,以使其生成单个 SQL 语句。目前我有这样的事情:

EDIT :为清楚起见删除了“where”过滤器 - “Id” 也是两种对象类型的数据库中的主键

hotel = (from h in db.Hotels

         let rooms = (from r in db.HotelRooms
                      where r.HotelId == h.Id
                      select new HotelRoom
                      {
                          Id = r.Id,
                          Code = r.Code,
                          Category = r.Category
                      })

         select new Hotel
         {
             Id = h.Id,
             Name = h.Name,
             Rooms = rooms.ToList()
         }).FirstOrDefault();

酒店业务级别类定义为:

public class Hotel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<HotelRoom> Rooms { get; set; }
}

其中查询使用初始化程序在执行查询时从 DataContext 实体动态创建 business 对象。

问题显然是,Rooms 集合上的 .ToList() 会导致通过第二个查询填充 Hotel.Rooms 集合。

有没有办法用所有 HotelRooms 填充 Hotel.Rooms 属性,而不会产生额外的查询?

【问题讨论】:

    标签: .net linq-to-sql


    【解决方案1】:
      //grab the rows from the database in direct fashion.
    var joinedRows = 
    (
      from h in db.Hotels
      where h.Name == name
      from hr in h.HotelRooms
      select new {HotelRow = h, HotelRoomRow = hr}
    )
    .ToList();
    
      //shape the data locally
    List<Hotel> result =
      from row in joinedRows
      group row.HotelRoomRow by row.HotelRow into g
      let h = g.Key
      select new Hotel()
      {
        Id = h.Id,
        Name = h.Name,
        Rooms = (
          from r in g
          select new HotelRoom()
          {
            Id = r.Id,
            Code = r.Code,
            Category = r.Category
          }).ToList()
      };
    

    【讨论】:

    • 谢谢 - 但这似乎为数据库中的每个 HotelRoom 返回了 1 个带有 1 个 HotelRoom 的酒店。因此,如果有 10 家酒店,每家有 10 个房间 - 这将返回 100 个酒店项目,每个项目有 1 个房间。
    • 抱歉 - 只是为了澄清一点 - 我更改了上面的代码,删除了“name ==”条件以检索所有酒店而不是特定的酒店。这就是它返回数据库中所有酒店的原因。这不是我提出的问题 - 问题仍然是它为每个旅馆房间返回 1 个旅馆对象 - 每个旅馆对象只有 1 个房间。
    • 好吧,当我在测试控制台应用程序中尝试该确切代码时 - 它没有。我让它为每家酒店打印一条线 - 该酒店的房间数量。它打印了 1500 行,等于房间总数,而不是 279 行,酒店的数量——每家酒店只有 1 个房间——而不是显示它应该有的 4-10 个房间。
    • 您的酒店有主键吗?如果没有主键,此代码将无法运行。
    • 问题被修改以表明 ID 是主键
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2020-12-05
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多