1

次のオブジェクト構造を考えてみましょう。

Product
id : int
name : string
attribute : list of Attribute

Attribute
id : int
name: string
value : string
product_id : int

質問は次のとおりです。QueryOver を使用してサブクエリを作成し、次の条件ですべての製品を返す方法:

同時に次の属性を持つ製品をすべて選択してください:

属性名 = "Color" Value="Red" and 属性名 = "Size" Value="XXL" ?

編集:サンプルSQL:

select * from Product p where
exists (select id from attribute where name = 'Color' and value = 'Red' and product_id = p.id)
and
exists (select id from attribute where name = 'Size' and value = 'XXL' and product_id = p.id)
4

1 に答える 1

4

属性の一致をカウントするサブクエリを使用するのが最も簡単なIMOです

Product productAlias = null

// get the count of matching Attributes
var subquery = QueryOver.Of<Product>()
    .Where(p = > p.Id == productAlias.Id)
    .JoinQueryOver(p => p.Attributes)  
        .Where(a => (a.Name == "Color" && a.Value == "Red") || (a.Name == "Size" && a.Value == "XXL"))
    .Select(Projections.RowCount());

// get the Products where all match
var results = session.QueryOver(() => productAlias)
    .WithSubquery.WhereValue(2).Eq(subquery)
    .List();

Attribute クラスに Property Product がある場合、サブクエリを短縮できます。

于 2012-09-19T13:06:57.450 に答える