0

给定两个类似的类

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")));

然而,这不是我想要的。实际上,这不是关于博客和评论,而是关于版本化实体。在它们的父实体的映射中,我按它们的版本号对它们的集合进行排序。我需要能够访问第一个条目才能获得最新版本。

4

1 回答 1

0

为什么不在 db 中预过滤并使用 linq to objects 最终过滤呢?

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();

或者如果列表位置在评论中(这不漂亮)

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>();
于 2012-10-11T09:16:11.383 回答