如何将DetachedCriteria用于子查询中不同属性的复杂子查询?

时间:2013-05-17 22:01:04

标签: c# nhibernate subquery detachedcriteria

我有这个课程:

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%清楚我在这里所写的内容。我并不认为这是一个很好的解决方案。

0 个答案:

没有答案