【问题标题】:Fluent Nhibernate - Join query with group byFluent Nhibernate - 使用 group by 加入查询
【发布时间】:2015-11-30 07:31:42
【问题描述】:

我在 NHibernate 中执行连接查询时遇到问题。 我有以下表格:

BOOKS:
ID, NAME, BOOK_TYPE, AUTHOR_ID

AUTHORS:
ID, FIRST_NAME, LAST_NAME, BIRTH_DATE

我想在 Fluent 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>();

【问题讨论】:

  • 请用您的班级和映射定义更新您的问题
  • @kayess 发布了课程。

标签: c# sql nhibernate fluent-nhibernate queryover


【解决方案1】:

好吧,我们可以像这样通过加入和分组来做到这一点

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[]>();

【讨论】:

  • 这个想法很完美,但您不能为此使用选择组。见stackoverflow.com/questions/27527409/…
  • 你试过我的答案了吗?我只是重新运行..它正在工作。可以按照建议使用选择组。
  • 好的,所以我已经尝试过了,并且可行,但我不想要对象列表,我想要另一个对象的列表 - 我们称之为 GraphDTO。我编辑了我的答案,所以你可以明白我的意思
  • 这是标准要求。它可以通过 Transformer 轻松解决:stackoverflow.com/a/26901453/1679310stackoverflow.com/q/16496823/1679310。所以你快到了!太棒了;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多