nHibernate 查询继承

标签 nhibernate linq-to-nhibernate nhibernate-criteria queryover

我有这样的东西:

    public class User
    {
       /* some properties */
       public virtual int Id { get; set; }
       public abstract string LastName { get; }

    }
    public class Student 
    {
       public virtual int Id { get; set; }
       public virtual string LastName{ get; set; }
    }

    public class StudentUser : User
    {
       public virtual Student Student { set; get; }

        public override string LastName 
        {
            get { return Student.LastName; }
        }
    }

    public class foo
    {
         public virtual int Id { get; set; }

         public virtual IList<User> Users { get; set; }
    }


 1. I would like to do the following using QueryOver :
   var query = session.QueryOver<foo>();
       User User = null;

//case 1: This is not working
       query.JoinAlias(x=> x.Users , () => User )
                 .Where(() => ((StudentUser)User).Student.LastName == "smith" );

//case 2: Also This is not working
       query.JoinAlias(x=> x.Users , () => User )
                 .Where(() => ((StudentUser)User).LastName == "smith" );

//case 3: This is working
       query.JoinAlias(x=> x.Users , () => User )
                 .Where(() => ((StudentUser)User).Id == 123 ); 

当我多次使用 query.JoinAlias(x=> x.Users , () => User ) 时,我收到此异常具有相同键的项目已经已添加

我还得到这个异常:无法解析属性:Student.LastName of:Entities.User(在情况 1 和情况 2 中)

但它正在使用 Id 属性(情况 3)

它可能看起来像:

SELECT        *
FROM         Foo INNER JOIN
                      Users ON Foo.Id = Users.FooId_FK INNER JOIN
                      Students ON Users.StudentId_FK = Students.Id
where Students.LastName = 'smith'

如何获取 LastName 属性值?

最佳答案

认为这应该有效:

session.QueryOver<foo>()
    .JoinQueryOver(f => f.Users)
    .JoinQueryOver(u => ((StudentUser)u).Student)
        .Where(st => st.LastName == "smith")

或者与JoinAlias保持一致:

User userAlias = null;
Student studentAlias = null;

session.QueryOver<foo>()
    .JoinAlias(f => f.Users, () => userAlias)
    .JoinAlias(() => ((StudentUser)userAlias).Student, () => studentAlias)
        .Where(() => studentAlias.LastName == "smith")

关于nHibernate 查询继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26115970/

相关文章:

c# - 找不到组件成员的 getter

nhibernate - NHibernate FetchMany 在两个以上的表上是否损坏?

c# - 使用 Nhibernate Criteria Api 查询集合?

nhibernate - SessionFactory - 多个数据库的一个工厂

c# - Linq 到 Nhibernate : HqlTreeBuilder with Elements how to use?

nhibernate - 如何使用 Criteria 或 QueryOver API 编写此 linq 查询

c# - 如何使用 NHibernate Criteria API 进行多重连接

NHibernate 多重内连接选择

Nhibernate 查询具有包含值的字典属性的项目

hibernate - 在 nHibernate 中使用 CreateCriteria 向连接添加限制