nhibernate 2 linq нетерпеливый груз - PullRequest
4 голосов
/ 15 ноября 2009

Я начинаю с nHibernate и у меня есть простой пример, что я не могу работать так, как хотел бы.

У меня есть два объекта модели (блог и сообщения), и я хотел бы загрузить их все в одном запросе для одного сценария. Я хочу ленивую загрузку в других случаях.

Я наивно думал, что смогу написать что-то вроде этого:

var blogs = session.Linq<Blog>().Expand("Posts");

Но это даст мне экземпляр блога для каждого поста, а не добавление постов в блог.

Я знаю, что делаю глупости. Может кто-нибудь указать, что это? Неужели мне нужно связать сущности поста и блога в моем запросе linq?

Код и сопоставления:

public class Blog
{
    public Blog()
    {
        Posts = new HashSet<Post>();
    }
    public virtual long Identifier { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
    public virtual Post AddPost(Post post)
    {
        post.Blog = this;
        Posts.Add(post);
        return post;
    }
}


public class Post
{
    public virtual long Identifier { get; set; }
    public virtual string Name { get; set; }
    public virtual Blog Blog { get; set; }
}

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="nhibEx" namespace="nhibEx">
  <class name="Blog" lazy="true">
    <id name="Identifier">
      <generator class="native" />
    </id>
    <property name="Name" not-null="true" length="100"/>
    <set name="Posts" inverse="true" cascade="save-update" lazy="true">
      <key column="BlogIdentifier" foreign-key="fk_Post_Blog"/>
      <one-to-many class="Post"/>
    </set>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="nhibEx" namespace="nhibEx">
  <class name="Post" lazy="true">
    <id name="Identifier">
      <generator class="native" />
    </id>
    <property name="Name" not-null="true" length="255"/>
    <many-to-one name="Blog" column="BlogIdentifier" class="Blog" />
  </class>
</hibernate-mapping>

Ответы [ 3 ]

4 голосов
/ 20 ноября 2009

После поиска на других форумах (возможно, мне следует сначала сделать это правильно!), Я использую это решение:

var blogs = session.Linq<Blog>();
blogs.QueryOptions.RegisterCustomAction(
criteria => criteria.SetResultTransformer(new DistinctRootEntityResultTransformer()));
var results = blogs.Expand("Posts");

Я не хотел использовать Distinct, поскольку хотел вернуть IQueryable

Кажется, работает. Мне просто нужно знать теорию:)

http://nhforge.org/wikis/howtonh/get-unique-results-from-joined-queries.aspx

1 голос
/ 15 ноября 2009

Отличное - это то, что вам нужно ...

Редактировать: Когда это не работает: сделайте отличное после толиста.Я не знаю, почему NHibernate загружает то же количество объектов, что и количество возвращенных записей в базе данных, и не выполняет различение автоматически.Эта проблема / функция не специфична для Linq, но также возникает, когда вы используете критерии или hql.

session.Linq<Blog>().Expand("Posts").ToList().Distinct();

Иногда может быть эффективнее выполнить 2 запроса (отдельно или с использованием нескольких запросов / будущего), чем выполнятьодин запрос с левым внешним соединением.

0 голосов
/ 17 ноября 2009

У нас точно такая же проблема. Мне кажется, что linq всегда в активном режиме загрузки. Так что вам не нужно делать exapnd. Однако это очень плохо. Вы пытались связаться с парнями из HN в их группе Google?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...