我使用nhibernate和流利的nhibernate。
我想知道这两种方式之间是否存在任何差异。
选项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();
我猜我是否会抓取/急切加载所有内容然后会有所不同(性能,查询数量等)。
但是,如果我懒加载怎么样?
答案 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
子查询在单个查询中完成整个事情。