【发布时间】:2010-05-07 21:22:27
【问题描述】:
我试图弄清楚是否有一种方法可以通过子查询或其他更优化的方式严格使用 Criteria 和 DetachedCriteria 执行以下操作。 NameGuidDto 只不过是一个具有字符串和 Guid 属性的轻量级对象。
public IList<NameGuidDto> GetByManager(Employee manager)
{
// First, grab all of the Customers where the employee is a backup manager.
// Access customers that are primarily managed via manager.ManagedCustomers.
// I need this list to pass to Restrictions.In(..) below, but can I do it better?
Guid[] customerIds = new Guid[manager.BackedCustomers.Count];
int count = 0;
foreach (Customer customer in manager.BackedCustomers)
{
customerIds[count++] = customer.Id;
}
ICriteria criteria = Session.CreateCriteria(typeof(Customer))
.Add(Restrictions.Disjunction()
.Add(Restrictions.Eq("Manager", manager))
.Add(Restrictions.In("Id", customerIds)))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Name"), "Name")
.Add(Projections.Property("Id"), "Guid"))
// Transform results to NameGuidDto
criteria.SetResultTransformer(Transformers.AliasToBean(typeof(NameGuidDto)));
return criteria.List<NameGuidDto>();
}
【问题讨论】:
-
经理和客户之间的映射是什么?
-
@dotjoe 员工(后备经理)* -> * 客户。员工(主要经理)1 -> * 客户。因此,您有 IList
manager.ManagedCustomers 和 IList manager.BackedCustomers。您还有 Employee customer.PrimaryManager 和 IList customer.BackupManagers. -
哦,那么您应该加入 BackupManagers。我将发布一个示例。
标签: nhibernate criteria detachedcriteria