Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有子计数的NHibernate父列表_C#_Mysql_Nhibernate_Fluent Nhibernate_Sql To Linq Conversion - Fatal编程技术网

C# 具有子计数的NHibernate父列表

C# 具有子计数的NHibernate父列表,c#,mysql,nhibernate,fluent-nhibernate,sql-to-linq-conversion,C#,Mysql,Nhibernate,Fluent Nhibernate,Sql To Linq Conversion,我在mysql中使用NHibernate4。我有两张桌子。我的桌子是猫和答案 public class cat { [Key] public virtual int id { get; set; } public virtual string catName { get; set; } public virtual IList<answer> answers { get; set; } } public class answer { [Ke

我在mysql中使用NHibernate4。我有两张桌子。我的桌子是猫和答案

public class cat
{
    [Key]
    public virtual int id { get; set; }
    public virtual string catName { get; set; }

    public virtual IList<answer> answers { get; set; }
}

public class answer
{
    [Key]
    public virtual int id { get; set; }
    public virtual int catId { get; set; }
    public virtual string detail { get; set; }
    public virtual bool stat { get; set; }

    [ForeignKey("catId")]
    public virtual cat cats { get; set; }
}
这样的结果

id-catName-计数

1-第5册

2-Pc-0

3-英语-22

4-第56条

我也尝试过这个NH查询

public class myClass {
  public virtual int count { get; set; }
  public virtual cat cats { get; set; }
}

var u = db.CreateCriteria(typeof(cat), "cats")
       .CreateAlias("answer", "t2", NHibernate.SqlCommand.JoinType.LeftOuterJoin, Restrictions.Eq("t2.stat", false))
      .SetProjection(Projections.ProjectionList()
      .Add(Projections.Count("t2.id"), "count")
      .Add(Projections.Group<cat>(g => g.id)));


var list = u.SetFetchMode("answer", FetchMode.Eager)
        .SetResultTransformer(Transformers.AliasToBean<myClass>())
        .List<myClass>();
公共类myClass{
公共虚拟整数计数{get;set;}
公共虚拟猫{get;set;}
}
var u=db.CreateCriteria(类型(cat),“cat”)
.CreateAlias(“answer”,“t2”,NHibernate.SqlCommand.JoinType.LeftOuterJoin,Restrictions.Eq(“t2.stat”,false))
.SetProjection(Projections.ProjectionList()项目)
.Add(Projections.Count(“t2.id”),“Count”)
.Add(projects.Group(g=>g.id));
var list=u.SetFetchMode(“应答”,FetchMode.Eager)
.SetResultTransformer(Transformers.AliasToBean())
.List();
此NHibernate查询返回也回答计数。但是猫总是返回空值。如何查询此结果

编辑1 我可以这样做

public class myClass {
  public virtual int count { get; set; }
  public virtual catId count { get; set; }
  public virtual cat cats { get; set; }
}


cat cats = null;
answer answers = null;

var u = db.QueryOver<cat>(() => cats)
    .JoinQueryOver(x => x.answers, () => answers, NHibernate.SqlCommand.JoinType.LeftOuterJoin, Restrictions.Eq("answers.stat", false))
    .SelectList(cv => cv
        .SelectCount(() => answers.id)
        .SelectGroup(c => c.id))
    .List<object[]>()
    .Select(ax => new myClass
    {
      count = (int)ax[0],
      catId = (int)ax[1],
      cats = (cat)db.QueryOver<cat>().Where(w=>w.id==(int)ax[1]).Fetch(fe => fe.answers).Eager.SingleOrDefault()
    })
    .ToList();
公共类myClass{
公共虚拟整数计数{get;set;}
公共虚拟catId计数{get;set;}
公共虚拟猫{get;set;}
}
cat=null;
答案=空;
变量u=db.QueryOver(()=>cats)
.JoinQueryOver(x=>x.answers,()=>answers,NHibernate.SqlCommand.JoinType.LeftOuterJoin,Restrictions.Eq(“answers.stat”,false))
.选择列表(cv=>cv
.SelectCount(()=>answers.id)
.SelectGroup(c=>c.id))
.List()
.选择(ax=>new myClass
{
计数=(int)ax[0],
catId=(int)ax[1],
cats=(cat)db.QueryOver().Where(w=>w.id==(int)ax[1]).Fetch(fe=>fe.answers).Eager.SingleOrDefault()
})
.ToList();

在您的结果中
cats
始终为空,因为
ResultTransformer
尝试按属性名称映射属性

请检查您的NHibernate日志文件。您可能会看到查询返回列
count
id
,但是
myClass
具有属性
count
cats

编辑:

新建议:

前面的建议无效,因为属性
id
的类型为
Int32
,无法分配给
myClass.cat
(类型为
cat

如果不需要对
myClass
中的
cat
-对象进行引用,则可以将其更改为:

public class myClass {
  public virtual int count { get; set; }
  public virtual int catId { get; set; }
}
有这样的投影:

.Add(Projections.Group<cat>(g => g.id), "catId"));
在查询逻辑之后添加以下内容:

IList<myClassResult> result = new List<myClassResult>();
foreach (var idWithCount in list) 
{
  result.Add(new myClassResult() 
  {
    cats = catsOnlyList.FirstOrDefault(x => x.id == idWithCount.catId),
    count = idWithCount.count
  });
}
使用

.Add(Projections.Group(g=>g.id),“cats”);

我可以这样做查询

select count(t2.id) as count, cats.*from cat cats left join answer t2 ON(cats.id=t2.catId and t2.stat=0) GROUP BY(cats.id);
public class myClass {
  public virtual int count { get; set; }
  public virtual İnt catId { get; set; }
  public virtual cat cats { get; set; }
}

cat cats = null;
answer answers = null;

var u = db.QueryOver<cat>(() => cats)
    .JoinQueryOver(x => x.answers, () => answers, NHibernate.SqlCommand.JoinType.LeftOuterJoin, Restrictions.Eq("answers.stat", false))
    .SelectList(cv => cv
        .SelectCount(() => answers.id)
        .SelectGroup(c => c.id))
    .List<object[]>()
    .Select(ax => new myClass
    {
      count = (int)ax[0],
      catId = (int)ax[1],
      cats = (cat)db.QueryOver<cat>().Where(w=>w.id==(int)ax[1]).Fetch(fe=>fe.answers).Eager.SingleOrDefault()
    })
    .ToList();
公共类myClass{
公共虚拟整数计数{get;set;}
公共虚拟İnt catId{get;set;}
公共虚拟猫{get;set;}
}
cat=null;
答案=空;
变量u=db.QueryOver(()=>cats)
.JoinQueryOver(x=>x.answers,()=>answers,NHibernate.SqlCommand.JoinType.LeftOuterJoin,Restrictions.Eq(“answers.stat”,false))
.选择列表(cv=>cv
.SelectCount(()=>answers.id)
.SelectGroup(c=>c.id))
.List()
.选择(ax=>new myClass
{
计数=(int)ax[0],
catId=(int)ax[1],
cats=(cat)db.QueryOver().Where(w=>w.id==(int)ax[1]).Fetch(fe=>fe.answers).Eager.SingleOrDefault()
})
.ToList();

Small Offtopic提示:如果您有选择权,请摆脱criteria api,使用from NHibernateFlorian Lim返回相同的列。给出此错误:无法将System.Int32类型分配给类型为的属性cat@ASPMaker对不起,我没有测试解决方案。我应该知道这是行不通的,因为按ID分组不会得到类型为
cat
的结果属性。我修改了我的答案。很抱歉,这个更改只给了我id。我想查询这个问题,它必须返回答案计数和带有答案子项的cat表。我在我的问题中解释了所有这些问题。@ASPMaker在这种情况下,您必须手动将结果组合在一起。请参阅我的第二次编辑。
.Add(Projections.Group<cat>(g => g.id)));
.Add(Projections.Group<cat>(g => g.id), "cats"));
public class myClass {
  public virtual int count { get; set; }
  public virtual İnt catId { get; set; }
  public virtual cat cats { get; set; }
}

cat cats = null;
answer answers = null;

var u = db.QueryOver<cat>(() => cats)
    .JoinQueryOver(x => x.answers, () => answers, NHibernate.SqlCommand.JoinType.LeftOuterJoin, Restrictions.Eq("answers.stat", false))
    .SelectList(cv => cv
        .SelectCount(() => answers.id)
        .SelectGroup(c => c.id))
    .List<object[]>()
    .Select(ax => new myClass
    {
      count = (int)ax[0],
      catId = (int)ax[1],
      cats = (cat)db.QueryOver<cat>().Where(w=>w.id==(int)ax[1]).Fetch(fe=>fe.answers).Eager.SingleOrDefault()
    })
    .ToList();