FluentNhibernate, получить частичный граф объекта - PullRequest
1 голос
/ 16 августа 2011

Поэтому я буду вызывать хранилище для извлечения корневого объекта графа сложного объекта, используя FluentNHibernate. Но для некоторых объектов подуровня я не хочу извлекать все элементы, а только те, в которых параметр даты равен определенному условию. В приведенном ниже коде я хочу, чтобы объект Order нижнего уровня фильтровался таким образом полем OrderTime.

То есть я хочу получить все группы пользователей со всеми пользователями, но объект «Заказы» каждого пользователя должен содержать заказы только с определенной даты или диапазона дат.

Итак, каковы мои варианты получения этого графа объектов? Я не хочу ленивой загрузки, я просто хочу указать несколько различных условий поиска, которые никогда не изменятся. Таким образом, они могут быть отдельными функциями хранилища, как предложено в конце. Но как бы я занялся кодированием этих методов, как задать эти условия?

Предметы:

public class UserGroup
{
    public int Id;
    public IList<User> Users;
}

public class User
{
    public int Id;
    public string Name;
    public IList<Order> Orders;
}

public class Order
{
    public int Id;
    public decimal Price;
    public System.DateTime OrderTime;
}

Repository:

public class UserGroupRepository
{    
    public List<UserGroup> GetAll()
    {
        using (ISession session = FNH_Manager.OpenSession()) {
            dynamic obj = session.CreateCriteria(typeof(UserGroup)).List<UserGroup>();
            return obj;
        }
    }
}

Потенциальные новые методы репозитория:?

public List<UserGroup> GetAll_FilterOrderDate(System.DateTime _date)
{
}

public List<UserGroup> GetAll_FilterOrderDate(List<System.DateTime> _dates)
{
}

1 Ответ

0 голосов
/ 16 августа 2011

Это действительно зависит от того, что вы хотите сделать с заказами.

Есть ли причина, по которой вам нужно запрашивать общий корень? Имеет ли смысл вместо этого запрашивать фактические заказы по дате? В итоге вы получите:

session.QueryOver<Order>().Where(t => t.OrderDate > ...);

Если ваши ассоциации настроены правильно, вы все равно сможете перейти к пользователю.

Лично я нахожу, что шаблон репозитория немного ограничен и предпочел бы использовать объекты запросов, так что в итоге вы получили бы что-то вроде:

queryService.FindAll<UserGroup>(new GetAllByFilterOrderDate(DateTime.Now));

Однако, если концепция репозитория работает для вас, во что бы то ни стало, придерживайтесь ее, но это означает, что вы попытаетесь принудить вашу объектную модель к этому центрированному представлению 'UserGroup'.

...