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

Jac*_*cob 5 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
                        });
Run Code Online (Sandbox Code Playgroud)

我使用它作为IQueryable没有问题所以我可以在实际运行查询之前做有用的事情.喜欢 :

WhereQuery.Skip(startRowIndex).Take(maximumRows).ToList();
Run Code Online (Sandbox Code Playgroud)

等等.

使用查询中的"where"语句会出现问题.例如:

WhereQuery.Where(s => s.StarRating == 1)
Run Code Online (Sandbox Code Playgroud)

将在运行时抛出异常,在User表中不存在'StarRating' - 当然它不是一个包装器属性.如果我实现查询,它将起作用

WhereQuery.AsEnumerable().Where(s => s.StarRating == 1)
Run Code Online (Sandbox Code Playgroud)

但是它失去了使用IQueryable的所有感觉,我不想这样做.

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

WhereQuery.Where(s => s.TalkInteractionDuringSession)
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ola 2

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

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

我确实意识到这不是您想要做的,但我认为您正在尝试改变框架以一种根本不自然的方式做一些事情。