1

1対多の関係に基づいてフィルタリングする必要があるクエリを理解するのに助けが必要です。テーブル「Product」と「ProductType」があります。「Product」には多くの「ProductType」があります。これらのモデルはうまく機能していますが、「ProductType」レコードに基づいて「Product」レコードをフィルタリングする方法がわかりません。

この例では、Product.Name == "somename" && Product.Version == "9.6" のすべての「製品」を選択したいと考えています。ProductType.Type == "someType" であるこれらの結果をフィルター処理したいと考えています。以下は例外をスローしています。

プロパティを解決できませんでした: ProductType of: my.namespace.ProductType

Ayende のブログの例を使用しています: Query Examples

 var product = _session.CreateCriteria<Product>()
                              .Add(Restrictions.Eq("Name", "somename"))
                              .Add(Restrictions.Eq("Version", "9.6"))
                              .Add(Subqueries.PropertyIn("Id",
                                                         DetachedCriteria.For<ProductType>()
                                                                         .SetProjection(Projections.Property("Product.Id"))
                                                                         .CreateCriteria("ProductType")
                                                                         .Add(Restrictions.Eq("Type", "someType"))
                                       )).List<Product>().SingleOrDefault();

私は近いですか?誰か助けてくれませんか?ありがとう!

編集

これは私を近づけます。2 番目の CreateCriteria を削除すると、タイプが入力された製品が返されます。結合を追加するとすぐに..結果が0になります。

 var products = _session.CreateCriteria("Product")
                                   .Add(Restrictions.Eq("Name", "somename"))
                                   .Add(Restrictions.Eq("Version", "9.6")) //This works
                                   .CreateCriteria("Types", "productTypes",   JoinType.LeftOuterJoin)
                                   .Add(Restrictions.Eq("Type", "typename")).List<Product>();

            return products.FirstOrDefault();
4

1 に答える 1

0

非常に近い - CreateCriteria に ProductType へのアクセス方法を指示するだけです。例えば:

var product = _session.CreateCriteria<Product>()
    .Add(Restrictions.Eq("Name", "somename"))
    .Add(Restrictions.Eq("Version", "9.6"))
    .Add(Subqueries.PropertyIn("Id",
         DetachedCriteria.For<ProductType>()
        .SetProjection(Projections.Property("Product.Id"))
        .CreateCriteria("Product.ProductType", JoinType.InnerJoin)
        .Add(Restrictions.Eq("Type", "someType"))
     ))
     .List<Product>()
     .SingleOrDefault();
于 2013-06-07T18:17:34.257 に答える