我有这样的课程:
public class BasicSearchResult
{
public virtual int ItemID { get; set; }
public virtual string Name { get; set; }
}
public class AdvancedSearchResult : BasicSearchResult
{
public virtual string DetailedData { get; set; }
}
public class BasicSearchResultMap : ClassMap<BasicSearchResult>
{
public BasicSearchResultMap()
{
Table("BASIC_SEARCH_VIEW");
ReadOnly();
Id(x => x.ItemID).Column("ITEM_ID").GeneratedBy.Assigned();
Map(x => x.Name).Column("PRODUCT_NAME");
}
}
public class AdvancedSearchResultMap : SubclassMap<AdvancedSearchResult>
{
public AdvancedSearchResultMap()
{
Table("ADVANCED_SEARCH_VIEW");
KeyColumn("ITEM_ID");
Map(x => x.DetailedData).Column("EXTRA_DATA");
}
}
基本和&amp;高级视图具有完全相同的项目(但高级视图后面的水平数据要多得多)。
这一切都很好,我可以从数据库中检索这个。我想要改变的问题是我希望仍然能够在不加入ADVANCED_SEARCH_VIEW的情况下检索JUST BasicSearchResult数据,因为该查询很昂贵。
换句话说,我只想在明确要求时检索子类。但是,即使我只要求BasicSearchResult,nhibernate也会过度帮助并且总是试图加入ADVANCED_SEARCH_VIEW。
当我明确要求该子类时,有没有人知道如何确保只有一个连接到子类?
换句话说,当我做的时候
session.Get<BasicSearchResult>(99);
导致这个sql:
SELECT
this_.ITEM_ID,
this_.PRODUCT_NAME,
case
when this_1_.ITEM_ID is not null then 1
when this_.ITEM_ID is not null then 0
end as clazz_2_
this_1_.EXTRA_DATA
FROM BASIC_SEARCH_VIEW this_
left outer join ADVANCED_SEARCH_VIEW this_1_
on this_.ITEM_ID = this_1_.ITEM_ID
WHERE
this_.ITEM_ID = 99
当我真的只想拥有:
SELECT
this_.ITEM_ID,
this_.PRODUCT_NAME
FROM BASIC_SEARCH_VIEW this_
WHERE
this_.ITEM_ID = 99
或者 - 我完全偏离基础,应该使用Join()来做这种事情吗?
感谢您对此主题的任何帮助。
答案 0 :(得分:0)
session.Query<BasicSearchResult>()
.Select(res => new BasicSearchResult
{
ItemID = res.ItemID,
Name = res.Name,
}).ToList();
使用aliasToBeanTransformer
写一个专门的映射