我有4节课 Person(具有对Animal类型的引用(将包含继承Animal的类)) 动物(抽象基地) 狗(继承动物) 猫(继承动物)
为了清楚我正在使用Table-per-class映射,所以我有一个Animal,Dog和Cat数据库表。
我想做的是选择每个有狗的人,如果可能的话,可以过滤狗类中的字段。如果可能的话,我宁愿通过类型安全代码完成所有这些操作,如果可能的话,不要直接使用SQL或字符串来阻止代码中断。
这是否可能(流利的1.2)nhibernate(3.1)?有人可以开始指点我正确的方向吗?我的查询比解释的要复杂一点,但这是它的核心。
还有点偏离主题,但有没有在mappingSession.QueryOver()下有所有方法的描述?那里有很多东西,有些是显而易见的,但像Fetch等其他人并不清楚他们都做了什么,可能就是为什么我这么难找到。
---编辑类供参考---
public class Person
{
Animal pet;
public string Name;
}
public abstract class Animal
{
public int ID;
public string Name;
}
public class Dog : Animal
{
public string Color;
}
public class Cat : Animal
{
public string someOtherVal;
}
只使用一个会话对象我希望得到所有不同的人姓他们有宠物类型Dog和狗是棕色的名字。
这是我想要最终得到的最终查询,但我试着开始只是让那些有狗的人,因为我认为这很容易,但似乎事实并非如此。
我原来的Querys试过了
Dog dog = null;
var test2 = session.QueryOver<Person>()
.Inner.JoinAlias(x=>x.Pet, ()=> dog)
.Where(()=>dog != null)
.List();
我也有预测可以减少它的名字,但我仍然无法限制只有狗的人。
答案 0 :(得分:0)
以下是如何实现此目标的示例:
http://jameskovacs.com/2011/02/16/getload-polymorphism-in-nhibernate-3/
var animal = session.CreateCriteria<Animal>()
.Add(Restrictions.IdEq(dogId))
.UniqueResult<Animal>();
你也可以试试这样的东西,我不是百分之百确定它会起作用,但是你可以尝试一下:
var animal = session.CreateCriteria<Animal>()
.Add(Restrictions.On<Dog>(m=>m.Id == 1))
.UniqueResult<Animal>();
这有帮助吗?