我在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; }
}
答案 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");
}
}