代码之家  ›  专栏  ›  技术社区  ›  Jacob

使用where语句的Linq到NHibernate包装器问题

  •  5
  • Jacob  · 技术社区  · 16 年前

    我正在使用wrapper从表用户那里获取一些数据

    IQueryable<StarGuestWrapper> WhereQuery =    
    session.Linq<User>().Where(u => u.HomeClub.Id == clubId && u.IsActive).Select(
                        u =>
                        new StarGuestWrapper()
                            {
                                FullName = u.Name + " " + u.LastName,
                                LoginTime = u.SomeDateTime,
                                MonthsAsMember = u.SomeIntergerValue,
                                StarRating = u.SomeOtherInteregValue, 
                                UserPicture = u.Photo.PhotoData, 
                                InstructorFullName = u.SomeInstructorName,
                                TalkInteractionDuringSession = u.SomeBoolValue,
                                GoalInteractionDuringSession = u.SomeOtherBoolValue
                            });
    

    我把它作为一个IQueryable来使用,这样在实际运行查询之前就可以做一些有用的事情。比如:

    WhereQuery.Skip(startRowIndex).Take(maximumRows).ToList();
    

    等等。

    在查询时使用“where”语句会出现问题。

    WhereQuery.Where(s => s.StarRating == 1)
    

    将在运行时引发用户表中不存在“星号”的异常- 当然不是 这是包装工的财产。如果我通过

    WhereQuery.AsEnumerable().Where(s => s.StarRating == 1)
    

    奇怪和有趣的是,并不是所有来自wrapper throw error的属性,所有bool值都可以在where语句中使用。例子:

    WhereQuery.Where(s => s.TalkInteractionDuringSession)
    

    它在EntityFramework中工作,为什么在NHibernate中会出现这个错误,如何让它按我希望的方式工作?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Chris Nicola    16 年前

    我的建议是,在明确希望命中数据库时,将代码更改为调用ToList()。您正在从存储库中传回一个未来值查询,此时从技术上讲,查询可能会发生任何事情。即使EF和LINQ2SQL也无法将任何可能的linq查询转换为SQL。

    我确实意识到这不是你想做的,但是我认为你试图弯曲框架来做一些事情,这一点都不自然。