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

时间:2012-06-10 21:21:07

标签: c# nhibernate queryover

我有以下情况,客户,可以在多个银行中拥有银行帐户。此关系在 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>

1 个答案:

答案 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