2009-09-10 155 views
0

爲什麼不能這個查詢工作,它總是返回一個空的列表(映射是好的,我確信數據庫有數據!)任何想法?爲什麼這個Nhibernate查詢返回一個空列表?

var ids = //IList<int> of ids 


var result = _session.CreateCriteria(typeof (User)) 
      .Add(Restrictions.InG("Id", ids)) 
      .CreateCriteria("Posts") 
      .AddOrder(Order.Asc("CreatedOn")) 
      .SetMaxResults(20) 
      .List<Post>(); 
+0

您正在詢問某種類型的用戶,然後以帖子列表的返回方式結束該查詢。否則我不確定?我通常不使用這些類型的數據訪問方法的CreateCriteria語法 – mikeschuld 2009-09-10 18:21:43

+0

@ mikeschuld:我確實有.CreateCriteria(「帖子」),所以我可以要求一個帖子列表 – 2009-09-10 18:25:04

回答

-2

好吧,我只是用來代替標準API HQL:

var result = _session.CreateQuery("from Post p order by p.CreatedOn where p.PostedBy.Id IN (" + sb + ")").List<Post>(); 

一切正常:)

+0

很酷。很高興三個選項中的一個可以爲你解決! :) – mikeschuld 2009-09-10 22:56:53

4

嘗試使用這樣的事情,而不是:

List<User> users = _session.CreateQuery("FROM User ORDER BY CreatedOn").List<User>().Where(u => ids.Contains(u.Id)); 

var posts = new List<Post>(); 
foreach(User user in users) { 
    posts.AddRange(user.Posts); 
} 

我想這將取決於您的用戶已經有一個帖子收藏,但大部分休眠實現應該有類似的東西在裏面。

你也可以壓縮它有點像這樣:

List<Post> posts = _session.CreateQuery("FROM Post ORDER BY CreatedOn").List<Post>().Where(p => ids.Contains(p.User.Id)); 

或第三個選項:

List<Post> posts = _session.CreateQuery("FROM Post ORDER BY CreatedOn WHERE User.Id IN (" + ids.ToArray().Join(",") + ")").List<Post>(); 
+0

這不是好用戶可能有數千個帖子我不想從數據庫中獲取它們,並將它們排序在內存中! – 2009-09-10 18:30:19

+0

@Yassir查看第三個選項。它應該只抓住正確的一套,而不是成千上萬不需要的。 – mikeschuld 2009-09-10 18:36:42

+0

Well createdon屬性是一個帖子屬性不是用戶屬性:) – 2009-09-10 19:04:49

相關問題