NHibernate LinqProvider / IQueryable:Where子句中是否支持FirstOrDefault()?

时间:2012-10-09 14:50:30

标签: .net linq nhibernate orm fluent-nhibernate

给出两个类似于

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

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

1 个答案:

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