我有这样的东西:
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/