2

次のクラスがあるとします

class Car { 
    public string Id;
    public string Make;
    public string Model;
    public double Price;
    public IEnumerable<string> Locations;
}

私の要件は、結果セットをユーザーに取得し、その上にいくつかのファセットを表示することです。これは、以下のステートメントでキャプチャされた基準です。

session.Query<Car>()
    .Where(c => c.Make == "Mazda")
    .Where(c => c.Price < 3000)
    .Where(c => c.Locations.Any(l => l.In("VIC", "NSW")))
.ToList();

上記のステートメントが結果セットを取得すると、理想的には、ファセットを取得したい場合に述語を作成する方法を変更せずに、実行したであろう結果セットを取得します

session.Query<Car, Car_Facets>()
    .Where(c => c.Make == "Mazda")
    .Where(c => c.Price < 3000)
    .Where(c => c.Locations.Any(l => l.In("VIC", "NSW")))
.ToFacets("facets/CarFacets");

ここでは、実際の述語を変更しておらず、移動先のインデックスと ToFacets 拡張機能のみを変更しています。

私のインデックスは次のようになります

public class Car_Facets : AbstractIndexCreationTask<Car> {  
    public Car_Facets() {
        Map = cars => from car in cars 
                              select new { car.Make, car.Model, car.Price, car.Locations};
    }
}   

これは機能しません。私のファセットは空に戻ります。指定されたクエリ要件のファセットを取得するには、クエリを次のように変更する必要があります

session.Query<Car, Car_Facets>().AsProjection<CarOnLocation>
   .Where(c => c.Make == "Mazda")
   .Where(c => c.Price < 3000)
   .Where(c => c.Location.In("VIC", "NSW"))
.ToFacets("facets/CarFacets");

location プロパティが平坦化された場所。それぞれのインデックスは

public class Car_Facets : AbstractIndexCreationTask<Car> {  
    public Car_Facets() {
        Map = cars => from car in cars 
                      from location in car.Locations
                      select new {car.Make, car.Model, car.Price, Location = location};
    }
}

いくつかの背景: 簡単にするために、上記のクエリ ステートメントで述語を where 句として指定しました。私のアプリケーション コードでは、Specification クラスで個別に定義された各述語を持っています。ioc を使用して、特定のインターフェイスを満たすすべての仕様を取得し、すべての仕様から式を作成し、最後に式の述語を上記のクエリに適用します。これにより、新しい述語を追加する必要がある要件がある場合、新しい仕様クラスを作成でき、ioc によって取得され、他のクラスに変更を加えずに適用される構成モデルが得られます。

問題 ですが、上記のコードで示したように、ファセットを取得するときにネストされたコレクションにクエリを実行すると述語が変更されるため、これ以上これを行うことはできません。したがって、これらの述語を 2 回定義するか、結果セット クエリ用とファセット クエリ用の 2 つの場所に記述する必要があります。要件が変更された場合は、2 つの場所でクエリを更新する必要があります。

質問 ネストされたコレクション基準が関係している場合に、結果セットとファセットの両方を取得するために同じ述語を再使用できるように、これを回避する方法はありますか?

同じ要件に対して、結果を取得する方法とファセットを取得する方法の 2 つの異なる方法でクエリを記述する必要がなければ、それは素晴らしいことです。

4

0 に答える 0