NHibernate Group //有问题

时间:2011-06-24 21:37:29

标签: c# nhibernate group-by

我首先要揭露我想做的事情,然后解释我的问题。 我有2个表:“CharItem”和“Attribute”,以及一个表“ItemAttribute”来链接它们,因为它是一个m:n关系。该表还可以定义属性的值。

我想搜索至少具有某些属性的所有项目。 sql查询是这样的:

SELECT  ci.*
FROM     CharItem ci 
INNER JOIN ItemAttribute ia
on ci.CharItemId = ia.CharItemId 
WHERE 
( 
(ia.AttributeId = 48 and ia.ValueX >= 1) 
or (ia.AttributeId = 6) 
) 
GROUP BY ci.CharItemId 
HAVING   count(ia.AttributeId) >= 2

所以你可以看到,我想要的是找到所有项目,所以我的查询必须 给我一些物品对象。

我已经尝试过这样做了,我想我几乎找到了解决方案,但是 我错过了什么。通过以下方法,我返回好处 ids,但不是一个完整的项目,我找不到如何获得一个完整的项目:x

  var query = Session 
  .CreateCriteria(typeof(CharItem), "ci") 
  .CreateCriteria("ci.ItemAttribute", "ia", JoinType.InnerJoin); 
  Disjunction disjunction = Restrictions.Disjunction(); 
  foreach (var entry in itemAttribs) 
  { 
    var attribute = entry.Key; 
    var sign = entry.Value.Item1; 
    var value = entry.Value.Item2; 
    var restrictAttrib = Restrictions.Eq("ia.Attribute", attribute); 
    Conjunction conjunction =Restrictions.Conjunction(); 
    conjunction.Add(restrictAttrib); 
    conjunction.Add(Restrictions.Eq("ia.Value", values[j])); 
    disjunction.Add(conjunction); 
  } 
  query.Add(disjunction); 
  query.SetProjection(Projections.ProjectionList() 
    .Add(Projections.GroupProperty("ci.CharItemId"),"CharItemid")); 
  query.Add(Restrictions.Ge(Projections.Count("ia.Attribute"), itemAttribs.Count)); 
} 
var charItems = query.List<CharItem>();

感谢您的帮助。

解决!检查答案,看看如何。

1 个答案:

答案 0 :(得分:1)

使用Projections时,NHibernate将仅返回投影中指定的属性。这就是为什么在上述情况下你只得到了ID。如果您想要item的所有其他属性,则需要将它们显式添加到投影列表中。