2011-08-29 126 views
2

我认为我正式会有点疯狂:)我已经有一些与Linq XML的工作,但因速度问题,我不得不返工和转换数据的地方它在一个地方数据库代替。现在我正在修改自己的管道代码以考虑Linq2Sql,但子查询与XML提供程序一起工作的返回方法结果的方法似乎现在不想工作?linq不返回所有对象的子查询方法


UPDATE

我发现我使用显示结果我的控制台应用程序做一些有趣的事情。例如,如果我调用的方法顺序如下:

 var available = manager.DoesHotelHaveAvailabilityForPeriod("BTHA", start, end, 10); 
     var results = manager.GetRoomTypesForPeriod("BTHA", start, end); 

可用性的作品,但getRoomTypes犯规返回roomTypes,如果我周围的交换他们则恰巧相反,返回了房间类型,但随后availabilility返回false,所以这就是为什么我得到了奇怪的结果,我只是不知道为什么会发生这种情况?


例如我的仓库返回此:

public LinqAvailabilityRepository() 
    { 
     var context = new AvailabilityDataContext(); 
     _typesTable = context.GetTable<RoomType>(); 
    } 

我顶层的方法调用执行此

public List<RoomType> GetRoomTypes(string hotelCode) 
    { 
     var results = from rt in _repository.RoomTypes 
         where rt.Rooms.Any(r => r.HotelCode == hotelCode) 
         select rt; 

     return results.ToList(); 
    } 

这个当我输出它的工作原理到屏幕在控制台

public List<RoomType> GetRoomAvailability(string hotelCode, DateTime startDate, DateTime endDate, int daysRequired) 
    { 
     var items = GetRoomTypes(hotelCode); 

     var results = items.Select(rt => 
      new RoomType 
      { 
       id = rt.id, 
       Code = rt.Code, 
       Description = rt.Description, 
       Name = rt.Name, 
       Rooms = rt.Rooms.Select(r => 
        new Room 
        { 
         id = r.id, 
         RoomRates = r.RoomRates.Where(rr => rr.EffectiveDate >= startDate && 
          rr.EffectiveDate <= endDate).ToEntitySet() 
        }) 
        .Where(r => r.RoomRates.Count == daysRequired) 
        .OrderByDescending(r => r.RoomRates.Count()).ToEntitySet() 
      }); 

     return results.ToList(); 
    } 

但是,当我打电话给以下时,房间集合为0,但我知道该方法返回基于相同查询的房间,因为之前我直接调用上述方法时输出了它。

public bool DoesHotelHaveAvailabilityForPeriod(string hotelCode, DateTime startDate, DateTime endDate, int daysRequired) 
    { 
     var items = GetRoomAvailability(hotelCode, startDate, endDate, daysRequired).ToList(); 

     return ((from i in items 
       where i.Rooms.Count == daysRequired 
       select i).Count() > 0); 
    } 

这也恰好为一对夫妇的地方,当我尝试这样子查询,我尽量不重复自己,用相同的代码不返回其他对象的其他方法,是不是我应该知道或我没有做?

任何帮助理解这将不胜感激。

抢在某些情况下,在某些情况下不

回答

0

深夜编程并没有帮助任何人:)我是一个傻瓜,并创建对象基于LINQ创建的对象模型SQL数据上下文(房间,房间类型,RoomRate等),我四处搜寻,看到一个说你不能从查询基于数据对象直接创建对象(之后我收到一个错误),使重构和创建映射模型到几个相应的DTO的对象,这似乎代码段已经澄清了这个问题:

示例代码更改: public List GetRoomAvailability(string hotelCode,DateTime startDate,DateTime endDate,int daysRequired) { var items = GetRoomTypesForPeriod(hotelCode,startDate , 结束日期);

 var results = items.Select(rt => 
      new RoomTypeDTO 
      { 
       id = rt.id, 
       Code = rt.Code, 
       Description = rt.Description, 
       Name = rt.Name, 
       Rooms = rt.Rooms.Select(r => 
        new RoomDTO 
        { 
         id = r.id, 
         RoomRates = r.RoomRates.Where(rr => rr.EffectiveDate >= startDate && 
          rr.EffectiveDate <= endDate).ToList() 
        }) 
        .Where(r => r.RoomRates.Count == daysRequired) 
        .OrderByDescending(r => r.RoomRates.Count()).ToList() 
      }); 

     return results.ToList(); 
    } 

感谢大家花时间看看。

罗布

0

所以你的函数返回GetRoomAvailability()正确?

如何追踪并使用一些断点来查看它们的不同之处?

我不确定,但为什么你将GetRoomAvailability() ToList()的返回值转换成DoesHotelHaveAvailabilityForPeriod()再次接收?

0

我怀疑你遇到了问题,因为在第一次查询时,你没有明确或隐含地加载导航集合,然后再调用.ToList()

试试这个(或类似的东西):

public List<RoomType> GetRoomTypes(string hotelCode) 
{ 
    var results = from rt in _repository.RoomTypes.Include("Rooms.RoomRates") 
        where rt.Rooms.Any(r => r.HotelCode == hotelCode) 
        select rt; 

    return results.ToList(); 
} 

还记得那对查询调用.ToList()不会调用上的导航项目.ToList()

如果您创建了返回IQueryable<RootType>而不是列表的私有方法,它可能会更好。

private IQueryable<RoomType> QueryRoomTypes(string hotelCode) 
{ 
    var results = from rt in _repository.RoomTypes.Include("Rooms.RoomRates") 
        where rt.Rooms.Any(r => r.HotelCode == hotelCode) 
        select rt; 

    return results; 
} 

public List<RoomType> GetRoomTypes(string hotelCode) 
{ 
    return this.QueryRoomTypes(hotelCode).ToList(); 
} 

public List<RoomType> GetRoomAvailability(string hotelCode, DateTime startDate, DateTime endDate, int daysRequired) 
{ 
    var items = this.QueryRoomTypes(hotelCode); 

    var results = items.Select(rt => 
    // ... 
} 

的一般规则是返回到外线来电时,只调用.ToList().ToArray()。不要在中间查询中使用它们。

+0

这是有趣的,上面的代码调用列出来很多次,因为我是desperatly尝试任何:)我已经更新了做新发现的问题,将在该方案中该解决方案帮助? – Modika

+0

我觉得包括是一个EF操作,而不是一般的Linq到SQL,因为我似乎无法使它工作 – Modika

+0

是的,Include是EF特定的。 LINQ to SQL Equivalent使用LoadWith (t => t.child)设置Context的LoadOptions。 –

0

我觉得有时候是有日期时间的比较问题。

例如,如果你试图找到一个日期的条目,可以说30-08-2011,如果数据库有入境日期30-08-2011 12:50:30,那么它不会返回结果。

你可以尝试的是..只需在SQL中的日期时间为00:00:00,并检查是否得到正确的结果。

+0

嗨元帅,谢谢你的回应,DateTime比较工作正常。 – Modika