我正在使用包装器从表 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/