C# NHibernate组//有问题
我将首先公开我想做的事情,然后解释我的问题。 我有两个表:“CharItem”和“Attribute”,还有一个表“ItemAttribute”链接这两个表,因为它是一个m:n关系。此表还可以定义属性的值 我想搜索至少具有某些属性的所有项目。sql查询如下所示:C# NHibernate组//有问题,c#,nhibernate,group-by,C#,Nhibernate,Group By,我将首先公开我想做的事情,然后解释我的问题。 我有两个表:“CharItem”和“Attribute”,还有一个表“ItemAttribute”链接这两个表,因为它是一个m:n关系。此表还可以定义属性的值 我想搜索至少具有某些属性的所有项目。sql查询如下所示: SELECT ci.* FROM CharItem ci INNER JOIN ItemAttribute ia on ci.CharItemId = ia.CharItemId WHERE ( (ia.Attribu
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
如您所见,我想要的是查找所有项,因此我的查询必须
还给我一些物品对象
我试着去做,我想我几乎找到了解决办法,但是
我错过了一些东西。使用以下方法,我返回good
ID,但不是完整的项目,我不知道如何获得完整的项目: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>();
var query=Session
.CreateCriteria(类型(CharItem),“ci”)
.CreateCriteria(“ci.ItemAttribute”、“ia”、JoinType.InnerJoin);
析取析取=限制。析取();
foreach(itemAttribs中的var条目)
{
var属性=entry.Key;
变量符号=entry.Value.Item1;
var值=entry.value.Item2;
var restrictAttrib=Restrictions.Eq(“ia.Attribute”,Attribute);
连接=限制。连接();
连词.Add(restrictAttrib);
连词.Add(Restrictions.Eq(“ia.Value”,Value[j]));
析取。加(连词);
}
添加(析取);
query.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty(“ci.CharItemId”),“CharItemId”);
Add(Restrictions.Ge(projects.Count(“ia.Attribute”)、itemAttribs.Count);
}
var charItems=query.List();
谢谢你的帮助
解决了!检查答案以了解如何操作。使用投影时,NHibernate将仅返回投影中指定的属性。这就是为什么在上述情况下,您只能获得ID。如果需要项的所有其他属性,则需要将它们显式添加到投影列表中。使用投影时,NHibernate将仅返回投影中指定的属性。这就是为什么在上述情况下,您只能获得ID。如果您想要项目的所有其他属性,则需要将它们显式添加到投影列表中。欢迎使用SO。请注意,查看我所做的编辑,了解如何在代码块中突出显示语法。欢迎使用SO。请注意,请查看我所做的编辑,以了解如何在代码块中获得语法高亮显示。我已尝试获取对象的所有属性,但仍然出现错误:“值\”System.object[]\“不是类型\“MuleOrganizationModel.EntityClass.CharItem\”,并且不能在此通用集合中使用。\r\n参数名称:value您必须使用resulttransformer将对象数组转换为Charitem列表事实上仍然存在一个问题:x它在几种情况下都可以正常工作,但是当我调用属性(一个项目可以有多个ItemAttributes)时,链接到我的项目对象的ItemAttributes没有加载,我尝试拥有我的对象的所有属性,但我仍然收到一个错误:“值\”System.Object[]\“不是类型\“MuleOrganizerModel.EntityClass.CharItem\”,不能用于此泛型集合。\r\n参数名称:值“必须使用resulttransformer将对象数组转换为CharItem列表事实上仍然存在一个问题:x它在几种情况下都可以正常工作,但是当我调用属性时,链接到我的item对象的ItemAttributes没有被加载(一个item可以有几个ItemAttributes)