【发布时间】:2012-10-09 14:50:29
【问题描述】:
给定两个相似的类
public class Blog
{
public virtual int BlogId { get; set; }
public virtual IList<Comment> Comments { get; set; }
}
public class Comment
{
public virtual int CommentId { get; set; }
public virtual Blog Blog { get; set; }
public string Title { get; set; }
}
我很难使用以下语句:
session.Query<Blog>.Where(b => b.Comments.FirstOrDefault().Title.Contains("my title")));
抛出的错误是:
Antlr.Runtime.NoViableAltException
使用 .Any() 有效:
session.Query<Blog>.Where(b => b.Comments.Any(c => c.Title.Contains("my title")));
然而,这不是我想要的。实际上,这不是关于博客和评论,而是关于版本化实体。在它们的父实体的映射中,我按它们的版本号对它们的集合进行排序。我需要能够访问第一个条目才能获得最新版本。
【问题讨论】:
-
不支持因为
FirstOrDefault()、ToList()等方法,它们将 IQueryable 完成为具体类型(原始类型、唯一实体和列表)。如果你调用这样的东西,你会得到一个异常,因为你仍然在执行的上下文中,是什么让你无法运行子查询。在这种情况下,您必须使用.Any方法,因为它会在 SQL 语句内部生成一个子选择。 -
为了解决您的问题,您可以在您的存储库中添加一个方法来获取第一个带有 idBlog 的评论。
-
@Felipe Orani:这是复杂查询的一部分,为每个博客触发选择不会很好。一个技巧是将 FirstCommentId 属性添加到实体 Blog 并通过公式映射该属性(“Select Top 1 CommentId from ...”),然后执行 .Any(c=> c.CommentId == b.FirstCommentId && c.Title.Contains("我的标题")
标签: .net linq nhibernate orm fluent-nhibernate