【问题标题】:(fluent) nhibernate - Select Object based on subclass of referenced base class in query(fluent) nhibernate - 根据查询中引用的基类的子类选择对象
【发布时间】:2012-03-07 14:55:38
【问题描述】:

我有 4 节课 Person(引用了 Animal 类型(将包含一个继承 Animal 的类)) 动物(抽象基础) 狗(继承动物) 猫(继承动物)

为了清楚,我正在使用每类表映射,所以我有一个 Animal、Dog 和 Cat DB 表。

我想要做的是选择每个拥有 Dog 的人,如果可能的话,能够过滤 dog 类中的字段。如果可能的话,我宁愿通过类型安全的代码来完成所有这些工作,而不是直接使用 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 dog = null;
            var test2 = session.QueryOver<Person>()
                .Inner.JoinAlias(x=>x.Pet, ()=> dog)
                .Where(()=>dog != null)
                .List();

我也有计划减少它的独特名称,但我仍然无法将其限制为仅限于有狗的人。

【问题讨论】:

    标签: nhibernate reference fluent-nhibernate subclass fluent


    【解决方案1】:

    以下是您如何实现此目的的示例:

    http://jameskovacs.com/2011/02/16/getload-polymorphism-in-nhibernate-3/

    var animal = session.CreateCriteria<Animal>()
                        .Add(Restrictions.IdEq(dogId))
                        .UniqueResult<Animal>();
    

    你也可以试试这样的东西,我不是 100% 确定它会起作用,但你可以试一试:

    var animal = session.CreateCriteria<Animal>()
                         .Add(Restrictions.On<Dog>(m=>m.Id == 1))
                         .UniqueResult<Animal>();
    

    这有帮助吗?

    【讨论】:

    • 谢谢我明天会做更多的阅读和测试,但我认为如果没有完美的工作,我希望这会让我接近。唯一的问题是我所拥有的只是会议而不是一个可以通过的人,但也许 doco 会让我明白这一点
    • 好的,如果您有任何问题,请告诉我!
    • 我仍然有问题。你从哪里得到你的 Person 对象,它应该是人还是动物?我也得到 m=>m.Id == person.Id 部分的编译错误,因为它不是投影或其他东西。
    • 在您发布答案之前,我更新了我的原始帖子以包含课程和我的原始查询。我没有发布您的答案副本,因为它无法编译,所以我认为我走错了路。
    • 我会看看你的代码并更新我的答案,坚持住!
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多