0

次のような 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 のリストを取得し、count メソッドまたはサブクエリを使用して 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、Name、および Count のみを選択するクエリが必要です...私のエンティティには 30 個以上のフィールドがある可能性があるためです...

ありがとうございました。

4

2 に答える 2

1

NHibernate Linq プロバイダーを使用すると、次のことができます。

public class dto
{
    public long Value { get; set; }
    public int Count { get; set; }
    public bool HasCount { get { return Count > 0; } }
}

注:私のDTOには、実際のカウントを調べる読み取り専用のプロパティがあります。クエリは次のとおりです。

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

これにより、次の sQL が生成されます

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_

を使用した実際の例を見たことがありませんQueryOver。私はそれを突き刺しましたが、それを機能させることができませんでした..

于 2013-04-11T10:00:31.590 に答える
1

この仕事に NHibernate 以外のものを使用するという選択肢は考えませんでしたか?
私の意見では、Dapper のような軽量ライブラリは、このユース ケースの優れたソリューションになる可能性があります。Nhibernate をいじくりまわす代わりに、非常に単純な SQL クエリを作成することになります。

編集:
dapper コードは次のように単純になります。

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);
    }
}
于 2013-04-10T17:25:48.250 に答える