2012-05-24 50 views
0

我使用流利的nhibernate加載POCO類。 我正在使用ClassMap衍生工具來指定映射。 我使用的配置是這樣的:流利的nhibernate壓縮加載參考

.Mappings(m => m.FluentMappings 
    .AddFromAssemblyOf<MyClass>() 
    .Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never()) 
    /** I am using Never() because I have poco classes, not virtual properties **/ 
) 

我想發出一個查詢,將加載所有與特定父ID子實體還沒有填充父 - 母是大規模

查詢

我如何發出此查詢,使用標準或一些其他映射或暗示發出查詢,但無法裝入父對象。 我想更好地控制什麼被加載。 它不一定是linq提供者。

var results = _session.Query<Child>().Where(_ => _.Parent.Id == ?).ToList(); 

public ParentMap() 
{ 
    Table("Parent"); 
    Id(x => x.Id).Column("ParentId"); 
    HasMany(x => x.Children) 
    .Table("Children") 
    .KeyColumn("ChildId").Inverse() 
} 

孩子

public ChildMap() 
{ 
    Table("Child"); 
    Id(_ => _.Id).Column("ChildId"); 
    References(_ => _.Parent).Column("PartyId").LazyLoad(Laziness.NoProxy); 
} 

回答

2

你可以只查詢子實體:

var query = _session.QueryOver<Child>() 
    .Where(x=>x.Parent.Id==id) 
    .List(); 

或者有更好的控制 - 使用投影和AliasToBean()變換器。喜歡的東西:

ChildDTO dto = null; 
var query = _session.QueryOver<Child>() 
.Where(x=>x.Parent.Id==id) 
.SelectList(list=>list 
    .Select(x=>x.SomeProperty).WithAlias(()=>dto.SomeProperty) 
    .Select(x=>x.SomeOtherProperty).WithAlias(()=>dto.SomeOtherProperty)) 
.TransformUsing(Transformers.AliasToBean<ChildDTO>()) 
.List<ChildDTO>(); 

ChildDTO dto = null; 
Child childAlias = null; 
var query = _session.QueryOver<Parent>() 
.JoinAlias(x=>x.Children,()=>childAlias, JoinType.InnerJoin) 
.Where(x=>x.Id==id) 
.SelectList(list=>list 
    .Select(x=>childAlias.SomeProperty).WithAlias(()=>dto.SomeProperty) 
    .Select(x=>childAlias.SomeOtherProperty).WithAlias(()=>dto.SomeOtherProperty)) 
.TransformUsing(Transformers.AliasToBean<ChildDTO>()) 
.List<ChildDTO>(); 
+1

如果孩子不能被代理,然後家長不能偷懶裝,所以第二個選項將需要 –

+0

@馬丁 - 這是什麼一個Vaalie瞭解NHibernate ;-) – Chev

+0

錯誤,但噓..別告訴任何人! :) –

相關問題