0

似ている 2 つのクラスが与えられた場合

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を使用して最終的にフィルタリングしないのはなぜですか?

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