给出两个类似于
的类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")));
但是,这不是我想要的。实际上,这不是关于博客和评论,而是关于版本化实体。在其父实体的映射中,我按其版本号对其集合进行排序。我需要能够访问第一个条目才能获得最新版本。
答案 0 :(得分:0)
为什么不在db中预过滤并使用linq对象来最终过滤它?
var results = session.Query<Blog>()
.Where(b => b.Comments.Any(c => c.Title.Contains("my title")))
.AsEnumerable()
.Where(b => b.Comments[0].Title.Contains("my title")))
.ToList();
或者Listposition是否在评论中(不是很漂亮)
Map(x => x.Position, "listindexcolumn").ReadOnly();
var results = session.Query<Blog>()
.Where(b => b.Comments.Any(c => c.Position == 0 && c.Title.Contains("my title")))
.ToList();
或使用仅查询属性
Map(x => this.Position, "listindexcolumn").ReadOnly().Access.None();
var results = session.CreateCriteria<Blog>()
.CreateCriteria("Comments")
.Add(Restriction.Eq("Position", 0) && Restriction.Like("Title", "my title"))
.ToList<Blog>();