RavenDB で製品をフィルタリングするには、長い切り替えを避けるために、製品フィルターの一般的なリストを使用します。
製品フィルター クラスは次のようになります。
public class ProductFilter
{
public string FilterName { get; set; }
public List<string> FilterValues { get; set; }
public ProductFilter()
{
FilterValues = new List<string>();
}
}
FilterName はインデックス プロパティ名と同じです
製品のクエリにこのインデックスを使用します。
public class CategoryProducts_Index : AbstractIndexCreationTask<Product, CategoryProducts_Index.ReduceResult>
{
public class ReduceResult
{
public string Category { get; set; }
public string Title { get; set; }
public string Brand { get; set; }
public decimal RegularPrice { get; set; }
}
public CategoryProducts_Index()
{
Map = products =>
from p in products
from c in p.Categories
select new
{
Category = c,
Title = p.Title,
Brand = p.Brand,
RegularPrice = p.RegularPrice
};
}
}
ProductFilter のリストをループして製品をフィルタリングする一般的なソリューションとして、次のような Lucene クエリのグループ化を実現したいと考えています。
Category: parent_category AND (Category: sub_category_1 OR Category: sub_category_2 OR ...etc) AND (Brand: brand1 OR Brand:brand2 OR ...etc)
通常の Linq クエリでは、文字列名でインデックス プロパティを取得できませんでした。そのため、次のように LuceneQuery でそれを実行しようとしました。
public IDocumentQuery<Product> GetProductsBySelectedFilters(string category, List<ProductFilter> productFilters)
{
IDocumentQuery<Product> products;
using (var session = DocumentStore.OpenSession())
{
products = session.Advanced.LuceneQuery<Product>("CategoryProducts/Index", isMapReduce: true)
.WhereStartsWith("Category", category);
foreach (var filter in productFilters)
{
products.UsingDefaultOperator(QueryOperator.And);
foreach (var value in filter.FilterValues)
{
products.WhereEquals(filter.FilterName, value);
products.UsingDefaultOperator(QueryOperator.Or);
}
}
}
return products;
}
これの Lucene 出力クエリは次のようになります。
Category: parent_category Category: sub_category_1 Category: sub_category_2 Brand: brand1 Brand: brand2 ...etc
それは私が期待したものではありません
誰かがこれを処理する方法を知っていますか?