鉴于我有以下课程
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");
位置属性已被展平的位置。相应的索引是
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 检索满足给定接口的所有规范,然后根据所有规范构建表达式,最后将表达式中的谓词应用于上面的查询。这给了我组合模型,如果我们有需要添加新谓词的要求,可以创建一个新的规范类,它会被 ioc 拾取并应用到任何其他类而不做任何修改
问题 ,但我不能再这样做了,正如我上面在代码中说明的那样,在检索方面时查询嵌套集合时,我的谓词会发生变化。因此,我必须两次定义这些谓词,或者将它们写在两个地方,一个用于结果集查询,另一个用于构面查询。如果需求发生变化,我将需要在两个地方更新查询。
问题 有没有办法解决这个问题,以便在涉及嵌套集合标准时可以重新使用相同的谓词来检索结果集和方面?
如果对于相同的要求,我不必以两种不同的方式编写查询,一种用于检索结果,另一种用于检索方面,那就太好了。