C# NHibernate组//有问题

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

我将首先公开我想做的事情,然后解释我的问题。 我有两个表:“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
如您所见,我想要的是查找所有项,因此我的查询必须 还给我一些物品对象

我试着去做,我想我几乎找到了解决办法,但是 我错过了一些东西。使用以下方法,我返回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)