5

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

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 的所有感觉,我不想这样做。

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

WhereQuery.Where(s => s.TalkInteractionDuringSession)

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

4

1 回答 1

2

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

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

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

于 2010-04-26T15:36:11.933 回答