我有以下情况,客户,可以在多个银行中拥有银行帐户。此关系在 Customer 类中描述为IDictionary(使用 map 标记映射):
public class Customer
{
public virtual IDictionary<Bank, string> Banks
{
get { return _Banks; }
set { _Banks = value; }
}
private IDictionary<Bank, string> _Banks = new Dictionary<Bank, string>();
}
IDictionary中的每个键代表银行,其中客户有一个帐户,字符串值是与此问题无关的简单状态。
我想要做的是NHibernate查询,以检索在指定的银行中拥有帐户的所有客户。我在Bank类中尝试了这个(因此这个关键字指的是一个Bank):
IList<Customer> customers = session.QueryOver<Customer>()
.Where(x => x.Banks.Keys.Contains(this))
.List();
当我尝试运行它时,甚至认为上面的查询编译没有错误我得到以下异常:
System.Exception:无法识别的方法调用:System.Collections.Generic.ICollection`1 [[Finance.Bank,Finance,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]:Boolean包含(Finance.Bank )
那我怎样才能正确执行这种查询呢?谢谢!
PS:This SO question显示如何为 ISet 集合执行此操作,this SO question表明使用ICriteria API可能无法实现我正在尝试的内容。< / p>
答案 0 :(得分:1)
经过一些研究后,我意识到包含方法中包含的逻辑可能无法以通用方式轻松地转换为SQL,这就是我获得该异常的原因。
对于任何有兴趣的人,我想出了以下解决方法:
IList<Guid> customerIds = session.CreateSQLQuery(
"SELECT Customer_ID FROM Banks WHERE Bank_ID = '" + this.ID + "'")
.List<Guid>();
Guid[] array = new Guid[customerIds.Count];
customerIds.CopyTo(array, 0);
IList<Customer> customers = session.QueryOver<Customer>()
.Where(Restrictions.In("ID", array)).List();
首先,它从关联表中提取给定 Bank_ID 的所有 Customer_IDs 。然后,在第二个查询中使用生成的 Customer_IDs 列表来检索客户对象。
PS:此解决方案适用于 SQL Server ,但当我切换到 MySql 时,我不得不略微更改它,因为它们以不同的方式代表Guid structure