Почему NHibernate Linq дублирует результаты? - PullRequest
0 голосов
/ 09 ноября 2009

У меня есть простой запрос Nhibernate Linq, который возвращает больше результатов, чем ожидалось:

  var result = (from foo in session.Linq<Foo>()
                      where foo.High.ID == High.ID
                      select foo).ToArray();

Фу выглядит так:

public class Foo : DomainLayerSuperType
{
  // ...other members omitted for clarity
  protected IList<Bar> associatedBars;

}

Моя проблема в том, что я получаю дубликат Foo для каждого бара в коллекции 'relatedBars'. Поэтому, если в коллекции имеется 20 столбцов для экземпляра Foo, я получу 20 экземпляров Foo, каждый из которых содержит 20 столбцов.

Отображение для Foo: (FluentNhibernate)

//other mappings omitted
HasMany<Bar>(x => x.AssociatedBars)
                .Access.CamelCaseField()
                .AsBag()
                .Table("dbo.Bar")
                .KeyColumn("FooID")
                .Cascade.AllDeleteOrphan()
                .Inverse()
                .Fetch.Join(); //eager load

Когда я выполняю этот эквивалентный запрос Hql, проблема не возникает:

var query = new StringBuilder();
query.AppendFormat("select foo from Foo foo where foo.High.ID = {0}", High.ID);
var result = session.CreateQuery(query.ToString()).List<Foo>().ToArray();

Кроме того, когда я меняю отображение для Foo, чтобы использовать отложенную загрузку для AssociatedBars, проблема не возникает.

Есть идеи? Кроме того, где лучший форум для Nh Linq? Я не смог найти ни одного такого поста здесь!

1 Ответ

3 голосов
/ 09 ноября 2009

Проблема в том, что текущий поставщик linq основан на критериях запросов. Когда вы устанавливаете свойство Fetch.Join в отображении, тогда, если вы проверите созданный SQL-запрос, вы увидите здесь соединение. Вы получаете повторяющиеся результаты благодаря этому соединению.

В HQL NHibernate использует другой способ генерации sql-запроса, и sql будет очень похож на ваш HQL, поэтому нет объединения и повторяющихся столбцов.

Для запроса liq вы можете попробовать использовать Distinct extention для получения только уникальных результатов запроса.

В настоящее время разрабатывается проект для создания поставщика linq на основе синтаксического анализатора HQL

...