RavenDb分面搜索谓词重复

时间:2011-10-29 10:29:25

标签: ravendb faceted-search

鉴于我有以下课程

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子句。在我的应用程序代码中,我在规范类中单独定义每个谓词,使用ioc我检索满足给定接口的所有规范,然后从所有规范构建表达式,最后将表达式中的谓词应用于上面的查询。这给了我组合模型,如果我们有需要添加新谓词的需求,可以创建一个新的spec类,它将由ioc拾取并应用而不对任何其他类进行任何修改

问题 但我不能再这样做了,正如我在上面的代码中所说明的那样,在检索facet时查询嵌套集合时我的谓词会发生变化。因此,我必须将这些谓词定义两次,或者将它们写在两个位置,一个用于结果集查询,另一个用于构面查询。如果需求发生变化,我需要在两个地方更新查询。

问题 有没有办法解决这个问题,以便在涉及嵌套收集条件时我可以使用相同的谓词来检索结果集和方面?

如果对于相同的要求,我不必以两种不同的方式编写查询,一种用于检索结果,一种用于检索方面,这将是很好的。

0 个答案:

没有答案