c# - 使用 where 语句的 Linq to NHibernate 包装器问题

标签 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 中会收到此错误以及如何让它按照我想要的方式工作?

最佳答案

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

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

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

关于c# - 使用 where 语句的 Linq to NHibernate 包装器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2621820/

相关文章:

c# - 这个左外连接查询的正确 Linq 表达式是什么?

c# - 如何让wcf服务每次只接受1个客户端

c# - 如何使通用类型和具体类型可以互换?

C#/NHibernate 有注释吗?

c# - 如何确保在资源上使用 using 关键字

c# - MVC 4 后期绑定(bind) DataContext 实体 LINQ 引用

c# - LINQ 查询列表中的列表

c# - 来自 fft 结果的功率谱密度 C#

c# - 从 If 语句返回 Int

c# - 需要加速automapper ...做113个对象需要32秒