Извлечение объекта и дочерней коллекции в NHibernate с помощью Linq

StackOverflow https://stackoverflow.com/questions/903756

Вопрос

У меня проблема с использованием Linq для NHibernate для загрузки объекта и быстрой загрузки дочерней коллекции.Объекты выглядят следующим образом:

public class Order
{
    public Guid Id {get; set; }
    public IList<OrderLine> OrderLines {get;set;}
}
public class OrderLine
{
    public Guid Id {get;set;}
    public string Item {get;set;}
}

Я пытаюсь загрузить Заказ с определенным идентификатором и (с нетерпением) все его дочерние строки заказа, используя Linq.Мой запрос выглядит следующим образом:

using (var s = _sessionFactory.OpenSession())
using (var tx = s.BeginTransaction())
{
    var order = from o in s.Linq<Order>().Expand("OrderLines")
                where o.Id == id
                select o;
    return order.First();
}

Однако, когда я показываю заказ, OrderLines свойство содержит только один объект - в базе данных определенно есть 3.Как ни странно, если я сделаю предысторию вокруг order перед возвратом я получаю все 3 дочерних элемента - но это попадает в базу данных дважды.

Я попытался изменить запрос, чтобы использовать Single() вместо этого, но это тоже не работает.

Я делаю что-то не так с linq?Или это мое использование Expand неверно?

Заранее спасибо,
Саймон.

Примечание:Я использую автоматическое сопоставление FluentNHibernate для создания своего NH-сопоставления, и моя база данных - это база данных Sqlite (файл, а не в памяти).

Это было полезно?

Решение

Похоже, что в этой функции есть ошибка:

FirstOrDefault() прерывает FetchType=join с помощью Linq для NHibernate

Взгляните на сгенерированный запрос к базе данных, если в нем есть предложение TOP 1, это может быть проблемой.

Помните, что Linq для NHibernate все еще далек от готовности к производству, поэтому такого рода ошибки могут возникать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top