流畅的nhibernate table-per-subclass想要返回基类类型的项而不加入子表

时间:2013-07-24 02:32:49

标签: nhibernate fluent-nhibernate

我有这样的课程:

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()来做这种事情吗?

感谢您对此主题的任何帮助。

1 个答案:

答案 0 :(得分:0)

选项1

session.Query<BasicSearchResult>()
    .Select(res => new BasicSearchResult
    {
        ItemID = res.ItemID,
        Name = res.Name,
    }).ToList();

选项2

使用aliasToBeanTransformer

选项3

写一个专门的映射