从Object获取值或执行其他查询有什么区别吗?

时间:2011-04-09 20:56:27

标签: nhibernate fluent-nhibernate

我使用nhibernate和流利的nhibernate。

我想知道这两种方式之间是否存在任何差异。

  1. 执行查询以从db(例如公司集合)获取对象集合。
  2. 现在我需要获得另一个产品引用表(比如产品)。
  3. 选项1

     var companies = session.Query<Companies>().ToList();
    companies.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();
    

    我猜我是否会抓取/急切加载所有内容然后会有所不同(性能,查询数量等)。

    但是,如果我懒加载怎么样?

2 个答案:

答案 0 :(得分:0)

我认为你在代码中有错误。不应该是:

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

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

尽管如此,答案并非毫不含糊。那是因为你真的要判断你是否需要大量查询产品。我会解雇sql profiler并在单元测试期间比较两种方法。

但是尝试至少一点点帮助,我通常使用选项2.我只在特定情况下选择选项1。

答案 1 :(得分:0)

我假设您希望第二个查询过滤Companies Product且ID == 1.那么您的查询应该看起来像这样:

选项1:

var companies = session.Query<Companies>().ToList();
var companiesWithSpecificProductId = 
    companies.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();

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