在几乎相同的查询中获得多个结果

时间:2013-02-07 15:42:28

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我在FNH中有两个非常相似的查询,代表类似的类,Project和Foo。 Foo只是一个派生自Project的新本地类。它的classMap也是从Project的classMap派生的。

    public class Foo:pcm.Domain.Project { }
    public class FooMap : pcm.Mappings.ProjectMapBase<Foo> { }

以下是我的查询,使用相同的会话:

        var list = session.Query<Project>()
            .Take(10)
            .ToList();

        var list2 = session.Query<foo>()
            .Take(10)
            .ToList();

        Assert.Equal(list.Count(),list2.Count());

断言失败,因为list有30个元素,list2有10个。确实只有10个项目。

编辑:以下是基础的映射,它位于自己的DLL中。

public class ProjectBaseMapTemplate<T> : ClassMap<T> where T: ProjectBase
{
    public ProjectBaseMapTemplate()
    {
        Table("proj");
        Id(x => x.MasterKey, "master_key");
        Map(x => x.ProjectName).Column("project_name");
        Map(x => x.ProjectTitle, "project_title");
    }
}
public class ProjectBaseMap : ProjectBaseMapTemplate<ProjectBase> { }

以下是派生类,它位于另一个DLL中。将类分离为DLL对于我需要使用FNH的方式至关重要。

    public class Foo:pcm.Domain.ProjectBase 
    {
            public virtual int ProjectState{ get; set; }
    }
    public class FooMap : pcm.Mappings.ProjectBaseMapTemplate<Foo> 
    {
        public FooMap()
        {
            Map(x=> x.ProjectState).Column("project_state");
        }
    }

更新以下是ProjectBase

public class ProjectBase
{
    public virtual string MasterKey { get; set; }
    public virtual string ProjectName { get; set; }
    public virtual string ProjectTitle { get; set; }
}

2 个答案:

答案 0 :(得分:1)

使用Take(10)功能时 底层选择所有查询将根据您的RDBMS功能运行 然后返回前10个结果(分页

由于您不使用 ORDER BY 表达式,因为分页和RDBMS功能导致相同的查询在多次执行中会有所不同。

希望有用。

答案 1 :(得分:0)

可能与此有关:

  

(10)polymorphism(可选,默认为隐式):确定是否使用隐式或显式查询多态。

     

隐式多态意味着类的实例将是   由命名任何超类或已实现接口的查询返回   或类和该类的任何子类的实例   由命名类本身的查询返回。显式多态性   表示只返回类实例的查询   显式地命名该类以及该类命名的查询   仅返回在此内部映射的子类的实例   声明为或。对于大多数目的   默认情况下,polymorphism =“implicit”是合适的。明确的   当两个不同的类映射到时,多态性很有用   相同的表(这允许包含子集的“轻量级”类   的表格列。)

因此,您可以使用:Polymorphism.Explicit();

修复映射

实施例

public class FooMap : pcm.Mappings.ProjectBaseMapTemplate<Foo> 
{
    public FooMap()
    {
        Polymorphism.Explicit();
        Map(x=> x.ProjectState).Column("project_state");
    }
}