[英]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();;
所以你有Posts
和Comments
表。 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,我假設Session
, Query
, Fetch
用於獲取 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.