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