1

我正在使用 Nhibernate,它是按代码映射的风格,可以使用复合键列表检索一组记录。我正在使用这样的复合键:

public class PersonAccountKey : IKey
{
        public virtual string PersonId { get; set; }
        public virtual string AccountNo{ get; set; }

        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            var t = obj as PersonKey;
            if (t == null)
                return false;
            if (PersonId == t.PersonId && AccountNo == t.AccountNo)
                return true;
            return false;
        }
        public override int GetHashCode()
        {
            return (PersonId).GetHashCode() + "|" + (AccountNo).GetHashCode();
        }
}

使用 PersonAccountKey 对象列表,我试图让 NHibernate 将单个查询发送到数据库。我想查询看起来像这样:

Select PersonId, AccountNo, AccountNickName 
From PersonAccount 
Where (PersonId = '11' and AccountNo = '10001111') 
or (PersonId = '22' and AccountNo = '10001150')

我不确定如何实现这一目标?我尝试将 Criteria 与复合键一起使用,但我认为它不应该一起使用。我现在正在尝试 Linq 2 NHibernate,但也没有真正到达任何地方。

理想情况下,我想要一种采用 IEnumerable 等键的方法Session.Get<T>(IEnumerable<object>),但这在我的搜索中不存在。

NHibernate 可以开箱即用吗?

干杯。

4

2 回答 2

0

MSDN 上有一篇关于Enumerable.Contains的文章,它可以满足我的需求。

我不知道 NHibernate 的 linq 是否完全支持这一点。它可能会拒绝这样做,但有例外。

于 2012-08-24T01:29:16.553 回答
0

与标量 ID 不同,没有直接支持使用复合键列表作为查询参数。这是应避免使用复合键的另一个示例。

这是一个简单的解决方法:

IEnumerable<PersonAccountKey> keys = GetKeys();
var query = session.CreateCriteria<PersonAccount>();
var keyCriterion = Restrictions.Disjunction();
foreach (var key in keys)
    keyCriterion.Add(Restrictions.Eq("id", key));
query.Add(keyCriterion);
var result = query.List<PersonAccount>();
于 2012-08-24T15:29:32.913 回答