2015-11-30 61 views
2

我在NHibernate中执行连接查询时遇到问题。 我有以下表格:母语者Nhibernate - 加入社区组查询

BOOKS: 
ID, NAME, BOOK_TYPE, AUTHOR_ID 

AUTHORS: 
ID, FIRST_NAME, LAST_NAME, BIRTH_DATE 

我想执行的功能NHibernate下面的SQL查询:

SELECT AUTHORS.ID, COUNT(BOOKS.ID) 
FROM AUTHORS 
INNER JOIN BOOKS 
ON AUTHORS.ID = BOOKS.AUTHOR_ID 
GROUP BY AUTHORS.ID; 

类:

public class Book 
{ 
    public virtual int id{get; set;} 
    public virtual string Name{get; set;} 
    public virtual int booktype{get; set;} 
    public virtual Author author{get; set;} 
} 

public class Author 
{ 
    public virtual int id{get; set;} 
    public virtual string FirstName{get; set;} 
    public virtual string LastName{get; set;} 
    public virtual DateTime BirthDate{get; set;} 
    public virtual IList<Book> Books{get; set;} 
} 

这是我曾尝试:

GraphDTO graph = null; 
Session.QueryOver<Book>() 
.SelectList(list => list 
.SelectGroup(x => x.Author.Id).WithAlias(() => graph.Id) 
.SelectCount(x => x.Id).WithAlias(() => graph.BooksNum)) 
.TransformUsing(Transformers.AliasToBean<GraphDTO>()) 
.List<GraphDTO>(); 
+0

请更新您的问题,以参加和组办呢您的班级和地图定义 – kayess

+0

@ kayess发布了课程。 – Pachu

回答

2

好了,我们可以通过这样的

Author author = null; 
Book book = null; 
var query = session.QueryOver<Contact>(() => author) 
    .JoinQueryOver(() => author.Authors,() => book) 
    .SelectList(list => list 
     .SelectGroup(x => author.ID) 
     // we can have more stuff from author table 
     .SelectGroup(x => author.LastName) 
     .SelectGroup(x => author.FirstName) 
     .SelectCount(x => book.ID)) 
    ; 

var result = query.List<object[]>(); 

但事实上,上面的SQL就不需要JOIN,这可能只是因为这里Fluent Nhibernate - selecting specific column and count query with group by

session.QueryOver<Book>() 
    .SelectList(list => list 
     .SelectGroup(c => c.Author.ID) 
     .SelectCount(c => c.ID)) 
    .List<object[]>(); 
+0

这个想法是完美的,但你不能使用选择组。见http://stackoverflow.com/questions/27527409/fluent-nhibernate-could-not-resolve-property – Pachu

+0

你试过我的答案?我刚刚重新那个..它正在工作。选择组可以按建议使用。 –

+0

好的,所以我已经尝试过,那是可行的,但我不想要一个对象列表,我想要另一个对象的列表 - 让我们称之为GraphDTO。我编辑了我的答案,所以你可以看到我的意思 – Pachu