我有这样的课程:
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");
}
}
基本视图和高级视图都具有完全相同的项目(但高级视图后面的水平数据要多得多)。
这一切都很好,我可以从数据库中检索它。我想改变的问题是我仍然希望能够在不加入 ADVANCED_SEARCH_VIEW 的情况下仅检索 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() 来做这种事情?
感谢您提供有关该主题的任何帮助。