C# 在NHibernate查询中用子查询填充DTO的属性

C# 在NHibernate查询中用子查询填充DTO的属性,c#,linq,nhibernate,hql,queryover,C#,Linq,Nhibernate,Hql,Queryover,我有这样一个DTO对象: public class TreeViewDTO { public string Value { get; set; } public string Text { get; set; } public bool HasChildren { get; set; } } 我用Nhibernate映射的实体是: public class Entity { public virtual int Id { get; set; } public vi

我有这样一个DTO对象:

public class TreeViewDTO
{
   public string Value { get; set; }
   public string Text { get; set; }
   public bool HasChildren { get; set; }
}
我用Nhibernate映射的实体是:

public class Entity
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
   public virtual Entity Parent { get; set; }
   /* other properties */
}
我想知道,如何获取DTO列表,并使用计数方法或子查询填充HasChildren属性,以了解是否存在子对象

我尝试过这个,但不起作用:

return Session.QueryOver<Entity>
                        .Select(entity => new TreeViewViewModel() {
                                                        Value = entity.Id.ToString(),
                                                        Text = entity.Name,
                                                        HasChildren = (Session.QueryOver<Entity>().Where(x => x.ParentId == entity.Id).RowCount() > 0)})
                        .ToList();
我遇到了一个异常:NotSupportedException,消息显示:x=>x.Parent.Id==[100001].Id,它不受支持

如何创建查询以填充此属性

PS:我想要一个只选择Id、名称和计数的查询。。。因为我的实体可以有30个或更多字段


谢谢。

< P>你没有考虑使用其他东西而不是NHiBiNATE来做这项工作吗? 在我看来,像Dapper这样的轻量级库对于这个用例来说是一个极好的解决方案。您将得到一个非常简单的sql查询,而不是使用Nhibernate

编辑: 简洁的代码如下所示:

public IDbConnection ConnectionCreate()
{
    IDbConnection dbConnection = new SQLiteConnection("Data Source=:memory:;pooling = true;");
    dbConnection.Open();
    return dbConnection;
}

public void Select()
{
    using (IDbConnection dbConnection = ConnectionCreate())
    {
        var query = @"SELECT e1.id as Value, e1.name as Text, CASE WHEN EXISTS
                        (SELECT TOP 1 1 FROM Entity e2 WHERE e2.parent = e1.id) 
                        THEN 1 ELSE 0 END as HasChildren
                    FROM Entity e1";
        var productDto = dbConnection.Query<TreeViewDTO>(query);
    }
}

使用NHibernate Linq提供程序,您可以执行以下操作:-

public class dto
{
    public long Value { get; set; }
    public int Count { get; set; }
    public bool HasCount { get { return Count > 0; } }
}
注意:my DTO有一个只读属性,用于查看实际计数,查询如下:-

var a = Db.Session.Query<Support>().Select(
         s => new dto {
                        Value = s.Id,
                        Count = s.CommentList.Count
                      }
            ).ToList();

我从未见过使用QueryOver的工作示例。我试过,但没法让它工作。

好吧,我再也不能改变它了。你知道我该怎么做吗?所以没有实体。子属性?不,在我的实体类中,我有引用另一个实体的父属性,不需要相同的类型。我只是想知道是否有引用该实体的子项。我不太熟悉NHibernate,但您不应该使用Session.Query with linq?是的,NHibernate支持使用Session.Query的Linq,但我不确定它是否支持像EF这样的所有功能。您是否可以使用定义了SQL的公式映射HasChildren属性,以检查是否存在ParentId为Id的记录?谢谢Rippo,但这对我有帮助,但我使用Linq查询上的let运算符来解决它,对于示例:var query=from d in query让c=d.Parents.Any选择新的ViewModel。。。。谢谢完美,我还不知道有什么实施。很高兴看到他们使LINQ提供程序变得更好。请注意,有时实际计数是有用的,但并非在所有情况下都有用。
select support0_.Id                                   as col_0_0_,
       (select cast(count(*) as SIGNED)
        from   supportcomment commentlis1_
        where  support0_.Id = commentlis1_.SupportId) as col_1_0_
from   support support0_