спасибо за ответ, я думаю, я понимаю, почему это так, но я бы подумал, что для этого будет встроенный метод, ваше решение работает, но похоже на хак!
Моя проблема в том, что дочерняя коллекция ОГРОМНА, если не отфильтрована (пример, который я привел для постов и комментариев, был для защиты имен невинных!), И теперь есть способ, которым я могу извлекать все данные каждый раз.
Я запустил Sql Profiler, и он все еще извлекает все данные.
когда я запускаю следующий код, первый запрос делает то, что вы ожидаете, только одно сообщение возвращается, но как только второй запрос выполняется, два запроса отправляются в базу данных, первый для получения отфильтрованных комментариев (бинго!), а затем секунду, чтобы заполнить свойство post.Comments всеми комментариями, чего я и пытаюсь избежать!
var post = session.CreateCriteria<BlogPost>()
.Add(Restrictions.Eq("Id", 1))
.UniqueResult<BlogPost>();
var comments = session.CreateCriteria<Comment>()
.Add(Restrictions.Eq("BlogPostId", 1))
.Add(Restrictions.Eq("DatePosted", new DateTime(2009, 8, 1)))
.List<Comment>();
post.Comments = comments;
это очень странно, не то, чтобы я перечислял список post.Comments, так почему он заполняет его ?! вот мои классы и карты:
public class BlogPostMap : ClassMap<BlogPost>
{
public BlogPostMap()
{
Id(b => b.Id);
Map(b => b.Title);
Map(b => b.Body);
HasMany(b => b.Comments).KeyColumnNames.Add("BlogPostId");
}
}
public class CommentMap : ClassMap<Comment>
{
public CommentMap()
{
Id(c => c.Id);
Map(c => c.BlogPostId);
Map(c => c.Text);
Map(c => c.DatePosted);
}
}
public class BlogPost
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual string Body { get; set; }
public virtual IList<Comment> Comments { get; set; }
}
public class Comment
{
public virtual int Id { get; set; }
public virtual int BlogPostId { get; set; }
public virtual string Text { get; set; }
public virtual DateTime DatePosted { get; set; }
}
есть идеи?