我有这个课程:
public class Property
{
public virtual int Id { get; set; }
public virtual IList<Value> AllValues { get; set; }
}
public class Value
{
public virtual int Id { get; set; }
}
public class ValueConnector
{
public virtual int Id { get; set; }
public virtual int ExtraPrice { get; set; }
public virtual Property Prop { get; set; }
public virtual Value Val { get; set; }
}
public class PropertyValues
{
public virtual int Id { get; set; }
public virtual Property Prop { get; set; }
public virtual IList<ValueConnector> Values { get; set; }
}
public class Product
{
public virtual int Id { get; set; }
public virtual IList<PropertyValues> PropertiesAndValues { get; set; }
}
这个想法是一个产品可以连接到一个属性,并且每个属性都可以连接到属于这个属性的一个或多个值。
我想按选定的值过滤产品。假设我有尺寸,颜色和面料的属性。 我想得到尺寸2和蓝色的产品(我不关心面料),就像ebay产品过滤一样。
我有以下代码:
var criteria = DeatachedCriteria.For<Product>();
var propToVals = DetachedCriteria.For<ValueConnector>()
.SetProjection(Projections.Id())
.Add(Restrictions.In("Val.Id", new[] { 2, 3, 4 })); // this are the value id's
var propToValCollection = DetachedCriteria.For<PropertyValues>()
.SetProjection(Projections.Distinct(Projections.Property("Prod.Id")))
.CreateCriteria("Values")
.Add(Subqueries.PropertyIn("Id", propToVals));
criteria.Add(Subqueries.PropertyIn("Id", propToValCollection));
它接近我想要的,但我也希望有可能获得没有用户过滤的任何属性的产品。而且我担心我不会100%清楚我在这里所写的内容。我并不认为这是一个很好的解决方案。