0

我有这样的课程:

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

感谢您提供有关该主题的任何帮助。

4

1 回答 1

0

选项1

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

选项 2

使用 aliasToBeanTransformer

选项 3

写一个专门的映射

于 2013-08-01T11:25:02.210 回答