1

私のコードの非常に単純化されたバージョンである次の例を参照してください。

Dim Criteria = Session.CreateCriteria(Of Person)()
Criteria.SetProjection(Projections.Property("Car"))
return Criteria.List(Of Car)()

これは完全に機能しますが、NHibernate 3.1 は結果を取得するために 2 つのクエリを作成します。何かのようなもの:

SELECT CarId FROM Person WHERE blababla

次に、各行について:

SELECT color, brand, wheels FROM Car WHERE CarId = ?

これはあまり効率的ではないので、試しました:

Criteria.CreateAlias("Car", "Car")
Criteria.SetFetchMode("Car", NHibernate.FetchMode.Join)

これは何もしません。最初のクエリで NHibernate に強制的に結合させるにはどうすればよいですか?

4

2 に答える 2

0

あなたがそうしProjections.Property("Car")、 Car が多対一の参照である場合、それは単に のエイリアスになりProjections.Property("Car.Id")ます。実際の Car オブジェクトを取得する場合は、次の 2 つのオプションがあります。

オプション 1: 射影リストで車のすべてのプロパティを指定します。

Criteria.CreateAlias("Car", "Car")
Criteria.SetFetchMode("Car", NHibernate.FetchMode.Join)
Criteria.SetProjection(Projections.Projectionist() _
           .Add(Projections.Property("Car.Color")) _
           .Add(Projections.Property("Car.Brand")))

wheel が別のエンティティ リストである場合は、さらに複雑になります。

オプション 2: 車の観点からクエリを指定する

Criteria.CreateCriteria(Of Car)()
Criteria.CreateAlias("Person", "person")
... //specify your criteria

プロジェクションを使用せず、フェッチされた Car オブジェクトで Person オブジェクトを取得する追加のオプションもあります

于 2011-04-28T16:32:28.560 に答える
0

サブクエリを使用して回避策を見つけました。これは機能しますが、結合を使用した方が効率的だと思うので、元の質問はまだ残っています。私の回避策:

var cars = s.CreateCriteria<Cars>()
    .Add(Subqueries.PropertyIn("Id",
        DetachedCriteria.For<Person>()
            .Add(Restrictions.Eq("Name","MyName"))
            .SetProjection(Projections.Property("Car.Id"))
        ))
    .List<Cars>();
于 2011-04-28T21:03:42.597 に答える