Linq to NHibernate使用where语句包装问题

时间:2010-04-12 11:58:48

标签: c# nhibernate linq-to-entities linq-to-nhibernate

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

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)

会在运行时抛出异常,用户表中不存在'StarRating' - 当然它不是它是一个包装器属性。如果我通过

实现查询,它将起作用
WhereQuery.AsEnumerable().Where(s => s.StarRating == 1)

然后它失去了使用IQueryable的所有感觉,我不想这样做。

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

WhereQuery.Where(s => s.TalkInteractionDuringSession)

它在EntityFramework中工作,为什么我在NHibernate中遇到这个错误以及如何让它以我想要的方式运行?

1 个答案:

答案 0 :(得分:2)

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

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

我确实意识到这不是你想要做的,但我认为你正在努力弯曲框架以某种方式做某事,这根本不是很自然。