如何使用NHibernate查询键值集合?

3
我有一个场景需要翻译,一个“客户”可以在多个“银行”拥有银行账户。这种关系在“客户”类中使用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类内尝试了这个操作(因此this关键字是指一个银行):
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 Contains(Finance.Bank)
那么我该如何正确执行这种查询?谢谢!
PS:这个 SO 问题展示了如何处理 ISet 集合,而这个 SO 问题表明使用 ICriteria API 可能不可行。
1个回答

1
经过更多的研究,我意识到Contains方法中包含的逻辑可能无法以通用的方式轻松地转换为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列表来检索Customers对象。

附注:此解决方案适用于SQL Server,但当我切换到MySql时,我不得不稍微更改它,因为它们以不同的方式表示Guid结构


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接