我在查询中遇到问题,该查询在表格中返回2个相同的客户记录, 所以在我的数据库中,我得到了一个客户表,一个CustomerProduct表,我得到了一个Product表, 顾客可以有很多产品。
public IPagedList<Customer> SearchCustomer(string product, string address, string county)
{
ICriteria criteria = Session.CreateCriteria<Customer>()
.CreateAlias("CustomerProducts", "cp")
.CreateAlias("cp.Product", "p");
if (!string.IsNullOrEmpty(product))
{
criteria.Add(Restrictions.Like("p.Name", product));
}
if (!string.IsNullOrEmpty(address))
{
criteria.Add(Restrictions.Like("Address1", address, MatchMode.Anywhere));
}
if (!string.IsNullOrEmpty(county))
{
criteria.Add(Restrictions.Like("County", county, MatchMode.Anywhere));
}
return criteria.Future<Customer>();
}
以上查询返回客户记录两次,因为客户有很多记录! 任何想法/想法如何解决这个问题,都会很棒 谢谢
答案 0 :(得分:1)
实际上有两种方法:
1)使用事后 Distinct
结果转换器:
criteria.SetResultTransformer(NHibernate.Transform.Transformers.DistinctRootEntity);
但我强烈建议:不要这样做。你将永远无法应用分页。
2)不要加入集合,使用BATCH加载(所有)集合
因此,让我们使用批量加载,而不是加入集合并创建cartesion产品:
小引用:
NHibernate可以有效地使用批量提取,也就是说,如果访问一个代理(或集合),NHibernate可以加载几个未初始化的代理。批量提取是懒惰选择提取策略的优化。有两种方法可以调整批处理获取:在类和集合级别上。
更容易理解批量提取类/实体。想象一下,您在运行时遇到以下情况:您在一个ISession中加载了25个Cat实例,每个Cat都有一个对其所有者的引用,一个Person。 Person类使用代理映射,lazy =“true”。如果您现在遍历所有猫并在每个猫上调用cat.Owner,NHibernate将默认执行25个SELECT语句,以检索代理所有者。您可以通过在Person:
的映射中指定批量大小来调整此行为
<class name="Person" batch-size="10">...</class>
或收藏:
<class name="Person">
<set name="Cats" batch-size="3">
...
</set>
</class>
请详细了解,请注意以下几点: