我正在使用包装器从表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中遇到这个错误以及如何让它以我想要的方式运行?
答案 0 :(得分:2)
请记住,旧的nHibernate Linq提供程序只是部分实现,不再受到积极处理。现在正在开发一个新的更完整的linq提供程序,它将成为NH3.0的一部分(您可以检查主干并构建它以查看它是否解决了这个问题。)
我建议您在明确希望点击数据库时更改代码以调用ToList()。您正在从存储库中传回未来有价值的查询,此时查询可能会发生任何技术问题。即使EF和LINQ2SQL也无法将任何可能的linq查询转换为SQL。
我确实意识到这不是你想要做的,但我认为你正在努力弯曲框架以某种方式做某事,这根本不是很自然。