gpt4 book ai didi

.net - 在不加入的情况下运行 NHibernate 查询

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:57 24 4
gpt4 key购买 nike

我有 Fluent 映射,可以将虚构的类 Customer 映射到订单列表。现在我想从数据库中获取所有客户而不加载订单。这可以在查询/标准/等中以某种方式指定,还是 LazyLoading 是唯一的解决方案?

虚构类:

public class Customer
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Order> Orders { get; set; }
}

public class Order
{
public virtual int Id { get; set; }
// ++
}

最佳答案

无论如何,延迟加载都会自动执行此操作,您是否正在尝试避免延迟加载?为什么?

例如:

IList<Customer> customers = _session.CreateCriteria<Customer>().List<Customer>();

只会给你所有的客户。只有当您调用 Customer 实体上的 Order 集合时,才会从数据库中获取订单,例如:

foreach(Customer customer in customers)
{
IList<Order> orders = customer.Orders; // Will hit the database
}

因此,如果您有 10 个客户,此代码将访问数据库 11 次(1 次获取客户,10 次检索每个客户的订单)。这给您带来了一个 SELECT N+1 问题,但如果您对每个客户的订单不感兴趣,那么就不要调用订单,它们将不会被获取。我并不是有意无礼,但这似乎很明显,我是不是误解了你的问题?


更新:回应评论。如果通过 Web 服务发送您的 POCO,您应该考虑使用报告查询,因为您的 POCO 会失去它们与 NHibernate Session 对象的连接,因此延迟加载将不起作用(Orders 集合将只返回 NULL)。换句话说,正确调用您的 Web 服务的“东西”不会知道任何关于 NHibernate 或您的领域模型的信息,因此:

public IList<CustomerView> GetAllCustomers()
{
return (from c in _session.Query<Customer>()
select new CustomerView()
{
Id = c.Id,
Name = c.Name
}).ToList();
}

public CustomerDetail GetCustomerFromId(int id)
{
return (from c in _session.Query<Customer>()
where c.Id == id
select new CustomerDetail()
{
Id = c.Id,
Name = c.Name
FullAddress = c.FormatFullAddress(),
Orders = c.Orders,
// other properties (snip)
}).SingleOrDefault();
}

如果您不使用 NHibernate 3.0,这将使用 NHibernate 3.0 中内置的 LINQ 提供程序,并且可以使用投影进行报告查询。语法使我逃避,所以在这里尝试 http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection

关于.net - 在不加入的情况下运行 NHibernate 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3776437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com