Nhibernate 从对象获取值或执行另一个查询有什么不同吗?

Nhibernate 从对象获取值或执行另一个查询有什么不同吗?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我正在使用nhibernate和流利的nhibernate 我想知道这两种方式之间是否有任何区别 执行查询以从db获取对象集合(例如公司集合) 现在我需要得到另一个products引用的表(比如products) 选择1 var companies = session.Query<Companies>().ToList(); companies.Where(x => x.products.Id == 1).toList(); var companys=session.Que

我正在使用nhibernate和流利的nhibernate

我想知道这两种方式之间是否有任何区别

  • 执行查询以从db获取对象集合(例如公司集合)
  • 现在我需要得到另一个products引用的表(比如products)
  • 选择1

     var companies = session.Query<Companies>().ToList();
    companies.Where(x => x.products.Id == 1).toList();
    
    var companys=session.Query().ToList();
    companys.Where(x=>x.products.Id==1.toList();
    
    所以我对结果对象进行过滤。我会和所有的公司一起做一些事情,但后来我需要把它过滤下来做一些其他的事情

    备选案文2

    一起执行另一个nhiberante查询

     var companies = session.Query<Companies>().ToList();
     var products = session.Query<Companies>().Where(x => x.products == 1).ToList();
    
    var companys=session.Query().ToList();
    var products=session.Query().Where(x=>x.products==1.ToList();
    
    我猜如果我获取/急切加载所有内容,那么会有不同(在性能、查询数量等方面)


    但是如果我是懒散加载呢?

    我认为您的代码有错误。难道不是:

    var companies = session.Query<Companies>().ToList();
    var products = companies.SelectMany(x => x.Products).Where(q => q.Id == 1).ToList();
    
    var companys=session.Query().ToList();
    var products=companys.SelectMany(x=>x.products).Where(q=>q.Id==1.ToList();
    

    var companys=session.Query().ToList();
    var products=session.Query().Where(x=>x.Id==1.ToList();
    
    ?

    尽管如此,答案并不明确。这是因为,是否需要大量查询产品,完全取决于您的判断。我会启动sql分析器,并在单元测试期间比较这两种方法


    但为了至少能帮上一点忙,我通常会使用选项2。我仅在特定场景中选择选项1

    我假设您希望第二个查询过滤具有Id==1的
    产品的
    公司。那么您的查询实际上应该如下所示:

    备选案文1:

    var companies = session.Query<Companies>().ToList();
    var companiesWithSpecificProductId = 
        companies.Where(x => x.Products.Any(p => p.Id == 1)).ToList();
    
    var companys=session.Query().ToList();
    var CompanyWithSpecificProductId=
    companys.Where(x=>x.Products.Any(p=>p.Id==1)).ToList();
    
    备选案文2:

    var companies = session.Query<Companies>().ToList();
    var companiesWithSpecificProductId = 
        session.Query<Companies>().Where(x => x.Products.Any(p => p.Id == 1)).ToList();
    
    var companys=session.Query().ToList();
    var CompanyWithSpecificProductId=
    session.Query().Where(x=>x.Products.Any(p=>p.Id==1)).ToList();
    

    在延迟加载的情况下,选项1将导致N+1问题,因为NHibernate必须为列表中的每个发票查询
    IList产品
    。在大多数情况下,这将比选项2慢得多,在选项2中,NHibernate将能够使用
    EXISTS
    子查询在单个查询中完成整个任务。

    您确定这是有效的代码吗?选项1中的产品在哪里?@MonkeyDeveloper-in公司。公司可以有很多产品
    var companies = session.Query<Companies>().ToList();
    var companiesWithSpecificProductId = 
        session.Query<Companies>().Where(x => x.Products.Any(p => p.Id == 1)).ToList();