簡體   English   中英

NHibernate LINQ 使用 GroupBy 查詢

[英]NHibernate LINQ query with GroupBy

我正在努力將 SQL 轉換為 NHibernate HQL。

SQL查詢

SELECT Posts.id, Count(Comments.id) FROM Posts LEFT JOIN Comments ON Posts.id=Comments.fk_post GROUP BY Posts.id

LINQ

Session.Query<Post>().Fetch(x => x.Comments).GroupBy(x => x.id, x => x.Comments)
                .Select(x => new { PostId = x.Key, CommentCount = x.Single().Count }).ToList();

這仍然失敗並出現異常:當需要輸入“Remotion.Linq.Clauses.StreamedData.StreamedSequenceInfo”時,參數“inputInfo”的類型為“Remotion.Linq.Clauses.StreamedData.StreamedSingleValueInfo”。

我的查詢有什么問題?

試試這個查詢:

var query = 
    from p in Session.Query<Post>()
    from c in p.Comments.DefaultIfEmpty()
    group c by p.Id into g
    select new 
    {
        PostId = g.Key,
        CommentCount = g.Sum(x => (int?)c.Id == null ? 0 : 1)
    }

var result = query.ToList();;

所以你有PostsComments表。 Posts 和 Comments 是一對多的關系:每個 Post 有零個或多個 Comments,每個 Comment 只屬於一個 Post,即外鍵Comments.fk_post所指的 Post。

您想獲取每個帖子的 ID 以及該帖子的評論數。

每當您需要 select “帶有零個或多個子項目的項目”時,例如帶有學生的學校、帶有訂單的客戶,或者在您的情況下帶有評論的帖子,請考慮使用Queryable.GroupJoin的重載之一。

您還可以看到 GroupJoin 是最明顯的解決方案,如果您看到 SQL Left Outer Join 后跟 GroupBy。 每當您看到 SQL 左外連接后跟 GroupBy 時,幾乎可以肯定您需要 GroupJoin。

如果您想要的不僅僅是“項目及其子項目”,請使用具有參數 resultSelector 的重載。

我不知道 nHibernate,我假設SessionQueryFetch用於獲取 IQueryables。 由於這不是問題的一部分,我讓您自己來獲取 IQueryables:

IQueryable<Post> posts = ...
IQueryable<Comment> comments = ...

// GroupJoin Posts with Comments
var postIdsWithCommentsCount = posts.GroupJoin(comments,

post => post.Id,               // from every Post take the primary key
comment => comment.fk_post,    // from every Comment take the foreign key to Post

// parameter resultSelector: from every Post, with all its zero or more Comments,
// make one new
(post, commentsOfThisPost) => new
{
    Id = post.Id,
    Count = commentsOfThisPost.Count(),
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM