Nhibernate 从对象获取值或执行另一个查询有什么不同吗?
我正在使用nhibernate和流利的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
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();