【问题标题】:QueryOver using an ignored propertyQueryOver 使用被忽略的属性
【发布时间】:2014-09-12 17:55:50
【问题描述】:

我有两个实体:

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

public class Child
{
    public virtual int Id { get; set; }
    public virtual int ParentId 
    { 
        get
        {
            if (Parent != null)
                return Parent.Id;
            return -1;
        }

        set
        {
            if (Parent != null)
                Parent = new Parent();
            Parent.Id = value;
        } 
    }

    protected virtual Parent Parent
    {
        get;
        set;
    }
}

Parent 属性是这样设置的,以简化 API 端,我不想更改它以公开此属性。我重写了 Child 类的映射以适应这种情况:

public class ChildMappingOverrides : IAutoMappingOverride<Child>
{
    public void Override(AutoMapping<Child> mapping)
    {
        mapping.References<Parent>(Reveal.Member<Child>("Parent")).Column("Parent_id");
        mapping.IgnoreProperty(x => x.ParentId);
    }
}

现在,如果我想查询给定父 ID 的所有 Child 对象,我会执行以下操作:

session.QueryOver<Child>().Where(c => c.ParentId == 1);

但是,这会引发 QueryException:

无法解析属性:ParentId of: My.Namespace.Child

如何检索具有特定 Parent Id 的 Child 对象集?

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate queryover


    【解决方案1】:

    未经测试,但你可以试试这个:

    session.QueryOver<Child>()
        .Where(Restrictions.Eq(
            Projections.SqlProjection(
                "{alias}.Parent_id as ParentId",
                new[] { "ParentId" },
                new[] { NHibernateUtil.Int32 }), 1))
        .List<Child>();
    

    您将无法在任何 NHibernate 查询中查询未映射的关联,但这至少可以最大限度地减少编译时检查的损失。

    据我所知,这有点有限。 {alias} 将始终被 root 实体的别名替换,这意味着如果您想对不以 Child 开头的更复杂的查询执行此操作,您可能会不走运.

    【讨论】:

    • 我更喜欢这个 :) 谢谢 Andrew,我做了一个小小的调整,只是为了匹配我的示例中的列名。
    • @PatrickQuirk:没问题——我希望有一种更可靠的方法来做你想做的事情
    【解决方案2】:

    我已经通过使用CreateSQLQuery 而不是QueryOver 解决了这个问题:

    session.CreateSQLQuery("SELECT C.* FROM CHILD C WHERE C.Parent_id = (:id)")
           .AddEntity(typeof(Child))
           .SetInt32("id", parentId)
           .List<Child>();
    

    如果可能的话,我希望看到一个更好的方法,失去编译时检查有点令人沮丧。

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多