2014-01-29 2 views
1

Я новичок в NHibernate и не очень хорош в Linq, но это серьезно ударяет по моему прикладу, и я не могу найти никаких действительно ясных примеров на SO.NHibernate Linq Query - выберите Sub Queries

Мне нужно получить информацию о потоке из базы данных, но мне нужно включить подзапрос, который подсчитывает количество сообщений в определенном потоке.

Вот это SQL Statement

Select ID, ThreadName, 
     (Select Count(Posts.ID) From Posts Where ThreadID = Threads.ID) as Replies 
From Threads 

и структура Класс:

Class Thread 
    Property ID as Integer 
    Property ThreadName as String 
    Property Replies as Integer 
End Class 

Class Post 
    Property ID as Integer 
    Property ThreadID as Integer 
    Property PostText as String 
End Class 

Любая помощь будет высоко ценится. И бонусные баллы для подачи как примера LINQ, так и одного с использованием синтаксиса NHibernate.

ответ

1

Так что запрос будет выглядеть так:

C#

var query = 
    from thrs in session.Query<YourNamespace.Thread>() // in C# Thread would need 
    select new YourNamespace.Thread // precise NS to distinguish System.Threading 
    { 
     ID = thrs.ID, 
     ThreadName = thrs.ThreadName, 
     Replies = thrs.Posts.Count() 
    }; 

var list = query.ToList(); // the above statement was executed 

VB:

Dim query = From t As Thread In session.Query(Of Thread)() 
       Select New Thread With { 
        .ID = t.ID, 
        .ThreadName= t.ThreadName, 
        .Replies = t.Posts.Count       
       } 
Dim list as List(of Thread) = query.ToList() 

Очень важно думать, здесь есть, что Threadнеобходимо иметь отображение в Posts

C#

public class Thread 
{ 
    ... 
    // really sorry for C# ... I will learn VB syntax ... 
    public virtual IList<Post> Posts { get; set; } 

VB

Public Class Thread 
    Public Overridable Property Posts As IList(Of Post) 

Если collection of Posts, будет отображаться в NHibernate, то выше синтаксис LINQ будет работать из коробки

+0

Excelent работа @Gman, я спасибо за помощь в VB! Наслаждайтесь NHibernate –