C# 使用where语句解决Linq到NHibernate包装问题

C# 使用where语句解决Linq到NHibernate包装问题,c#,nhibernate,linq-to-entities,linq-to-nhibernate,C#,Nhibernate,Linq To Entities,Linq To Nhibernate,我正在使用包装器从表用户获取一些数据 IQueryable<StarGuestWrapper> WhereQuery = session.Linq<User>().Where(u => u.HomeClub.Id == clubId && u.IsActive).Select( u => new StarGuestWrapper()

我正在使用包装器从表用户获取一些数据

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
                        });
等等

在查询中使用“where”语句时出现问题。 例如:

WhereQuery.Where(s => s.StarRating == 1)
将在运行时引发一个异常,即“StarRating”在用户表中不存在-当然不存在-这是一个wrappers属性。如果我将查询具体化为

WhereQuery.AsEnumerable().Where(s => s.StarRating == 1)
但是它失去了使用IQueryable的所有意义,我不想这样做

奇怪和有趣的是,并非包装器中的所有属性都会抛出错误,所有bool值都可以在where语句中使用。例如:

WhereQuery.Where(s => s.TalkInteractionDuringSession)

它在EntityFramework中工作,为什么我会在NHibernate中出现此错误,以及如何使其以我希望的方式工作?

请记住,较旧的NHibernate Linq提供程序只是部分实现,不再积极工作。现在正在开发一个新的、更完整的linq提供程序,它将成为NH3.0的一部分。您可以检查主干并构建它,看看它是否解决了这个问题

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


我确实意识到这不是您希望能够做到的,但我认为您正在尝试弯曲框架,以一种根本不太自然的方式来做一些事情。

您打算如何在数据存储中不存在的东西上查询哪个使用了数据存储?找到所有星号为1的对象的唯一方法是对所有对象进行枚举。@lase您似乎不了解ORM的工作原理,它是一个查询而不是集合,它不包含它为该数据查询数据库的数据。不要介意此包装中的硬编码值,这只是一个示例,我应该改为编写u.SomeValue。在创建新结果类型之前,它是一个查询,此时断开与数据存储的连接,select语句的结果不再是可查询的,您可以继续添加.Where子句。这与此类型的代码相同:从魔术C代码中选择*yourtable@Lasse,那么为什么布尔字段可以工作呢?我很确定这是nhibernate linq provider中的一个bug。Chris,上一个linq dll的版本是什么?2.0?我不知道,你可能必须去NHUsers列表上询问。你可能应该提到NH3.0刚刚发布了alpha版本,如果你想试用的话,它可能相当稳定。
WhereQuery.Where(s => s.TalkInteractionDuringSession)