在lambda表达式上,流畅的NHibernate“无法解析属性”

时间:2014-12-08 17:06:00

标签: c# nhibernate lambda fluent-nhibernate expression

我正在使用Fluent NHibernate并仅按惯例进行映射,这些是我要选择的类:

//The attributes are used in my conventions
[Table("Entries")]
public class Entry
{
    [Id] public virtual int EntryID { get; set; }
    [Join("UserID", Join.Left)] public virtual User User { get; set; }
}

[Table("Users")]
public class User
{
    [Id] public virtual int UserID { get; set; }
    public virtual string Name { get; set; }
}

我的选择功能是:

public IList<T> GetBy<T>(Expression<Func<T, bool>> expression) where T : class
{
    ISession session = _dal.GetSession(typeof(T));
    ICriteria criteria = session.CreateCriteria<T>();

    //Error: could not resolve property "User.Name"
    criteria.Add(Restrictions.Where<T>(expression));

    return criteria.List<T>();
}

我正在用这个表达式打电话:

IList<Entry> entries = Repository.GetBy<Entry>(e => e.User.Name == "Myself");

上面的代码适用于属于根类的表达式成员,但如果它涉及任何类的属性,则不行,我的问题是,无论如何我能以简单的方式完成上面的代码吗? (无需自己解析表达式。)

1 个答案:

答案 0 :(得分:0)

作为@Claudio Redi评论,标准不会解析第二级间接(e.User.Name)。您可以使用LINQ来解决此问题,例如:

public IList<T> GetBy<T>(Expression<Func<T, bool>> expression) where T : class
{
    ISession session = _dal.GetSession(typeof(T));

    var query = session.Query<T>().Where(expression);

    return query.ToList();
}