我首先要揭露我想做的事情,然后解释我的问题。 我有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>();
感谢您的帮助。
解决!检查答案,看看如何。
答案 0 :(得分:1)
使用Projections时,NHibernate将仅返回投影中指定的属性。这就是为什么在上述情况下你只得到了ID。如果您想要item的所有其他属性,则需要将它们显式添加到投影列表中。