创建动态提取表达式

时间:2011-08-10 17:05:46

标签: c# linq nhibernate linq-to-nhibernate

DomainModel 我有一个像这样的对象图。我想在Linq中动态构建fetch表达式到NHibernate,这样我就可以在一次SQL调用中获得所有对象图,

我认为,我可以写这样的抓取,这可以做到这一点,

IQueryable<Customer> lists = customerPersister.Query()
        .Where(item => item.Id == id)
        .FetchMany(item => item.LineOfBusiness)
        .FetchMany(i2 => i2.Address)
        .FetchMany(i3 => i3.Orders)
        .ThenFetchMany(i4=>i4.OrderItems) ;

但我并不总是需要所有这些对象图。有时我需要CustomerAddress,有时CustomerLinesOfBusiness或某个时间CustomerOrders

无论如何,我可以动态构建这个fetch表达式吗?

1 个答案:

答案 0 :(得分:0)

您应该可以根据需要简单地扩展查询:

IQueryable<Customer> lists = customerPersister.Query().Where(item => item.Id == id);
if (needLinesOfBusiness)
    lists = lists.FetchMany(item => item.LineOfBusiness);
if (needAddress)
    lists = lists.FetchMany(item => item.Address);
if (needOrders || needOrderItems)
{
    if (!needOrderItems)
        lists = lists.FetchMany(item => item.Orders);
    else
        lists = lists.FetchMany(item => item.Orders).ThenFetchMany(order => order.Items);
}

唯一的诀窍是ThenFetchMany不适用于IQueryable<Customer>,因此您需要一次性包含订单和订单商品。