2013-04-10 2 views
0

У меня есть объект DTO как это:Наполните свойство DTO с подзапрос в NHibernate Query

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 с помощью метода count или подзапроса, чтобы узнать, есть ли дети?

Я попытался это, но не работает:

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 полей или больше ...

спасибо.

+0

Значит, нет собственности 'Entity.Children'? –

+0

Нет, в моем классе «Entity» у меня есть свойство Parent, которое реферирует другой объект (не обязательно тот же тип). Я просто хотел бы знать, есть ли Дети, которые ссылаются на Сущность, о которой идет речь. –

+0

Я не слишком хорошо знаком с NHibernate, но разве вы не должны использовать 'Session.Query' с linq? –

ответ

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. У меня был удар, но он не мог заставить его работать.

+0

Спасибо, Rippo, но он помогает мне, но я решаю его с помощью оператора 'let' по запросу linq, для образца:' var query = from d in Query let c = d. Parents.Any() выберите новый ViewModel (...) '.спасибо –

+0

Отлично, не знал ЛЮБОЙ был реализован еще. Приятно видеть, что они делают провайдера LINQ лучше. – Rippo

+0

Помните, что вы иногда имеете фактический счет полезен, но не во всех случаях. – Rippo

1

Разве вы не рассматривали возможность использования чего-то другого, а не NHibernate для этой работы?
На мой взгляд, легкая библиотека, такая как Dapper, может быть блестящим решением для этого случая использования. В итоге вы получите просто запрошенный sql-запрос вместо того, чтобы перебирать Nhibernate.

Edit:
щеголеватый код будет так же просто, как это:

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); 
    } 
} 
+0

Ну, я больше не могу его менять. Вы знаете, как я могу это сделать? –

+0

имеют ответ на редактирование с использованием sql-запроса и использования dapper – Dima

Смежные вопросы