Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 如何在RavenDB查询中对一组筛选器运算符进行分组?_Linq_Lucene_Ravendb - Fatal编程技术网

Linq 如何在RavenDB查询中对一组筛选器运算符进行分组?

Linq 如何在RavenDB查询中对一组筛选器运算符进行分组?,linq,lucene,ravendb,Linq,Lucene,Ravendb,对于RavenDB中的过滤产品,我使用产品过滤器的通用列表,以避免长时间切换 product filter类看起来像: public class ProductFilter { public string FilterName { get; set; } public List<string> FilterValues { get; set; } public ProductFilter() { FilterValues = new

对于RavenDB中的过滤产品,我使用产品过滤器的通用列表,以避免长时间切换

product filter类看起来像:

public class ProductFilter
{
    public string FilterName { get; set; }
    public List<string> FilterValues { get; set; }

    public ProductFilter()
    {
        FilterValues = new List<string>();
    }
}
使用普通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;
    }
那不是我所期望的


有人知道如何处理这个问题吗?

使用LuceneQuery的.openSubcuse()和.closeSubcuse()

使用LuceneQuery的.openSubcuse()和.closeSubcuse()作为回答。现在我知道了:
Category:parent\u Category(Category:sub\u Category\u 1 Category:sub\u Category\u 2)(Brand:brand1 Brand:brand2)
!您可以使用.Or和.ANDALSOTANK u来添加
.AndAlso
完成了这项工作,而不是
。使用DefaultOperator(QueryOperator.And)
(此处建议:)thanx作为您的响应。现在我知道了:
Category:parent\u Category(Category:sub\u Category\u 1 Category:sub\u Category\u 2)(Brand:brand1 Brand:brand2)
!您可以使用.Or和.ANDALSOTANK u来添加
.AndAlso
完成了该工作,而不是
。使用DefaultOperator(QueryOperator.And)
(此处建议:)
Category: parent_category AND  (Category: sub_category_1 OR Category: sub_category_2 OR ...etc) AND (Brand: brand1 OR Brand:brand2 OR ...etc)
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;
    }
Category: parent_category Category: sub_category_1 Category: sub_category_2 Brand: brand1  Brand: brand2  ...etc