使用NHibernate通过单个查询和复合键检索一组记录

使用NHibernate通过单个查询和复合键检索一组记录,nhibernate,composite-key,Nhibernate,Composite Key,我正在使用Nhibernate,它通过代码风格映射,使用复合键列表检索一组记录。我使用的组合键如下所示: public class PersonAccountKey : IKey { public virtual string PersonId { get; set; } public virtual string AccountNo{ get; set; } public override bool Equals(object obj)

我正在使用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();
        }
}
Select PersonId, AccountNo, AccountNickName 
From PersonAccount 
Where (PersonId = '11' and AccountNo = '10001111') 
or (PersonId = '22' and AccountNo = '10001150')
通过PersonAccountKey对象列表,我试图让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();
        }
}
Select PersonId, AccountNo, AccountNickName 
From PersonAccount 
Where (PersonId = '11' and AccountNo = '10001111') 
or (PersonId = '22' and AccountNo = '10001150')
我不知道如何才能做到这一点?我尝试将标准与复合键一起使用,但我认为它不应该一起使用。我现在正在尝试Linq 2 NHibernate,但也没有取得任何进展

理想情况下,我希望有一个方法可以接受IEnumerable键,例如
Session.Get(IEnumerable)
,但我的搜索不存在这个方法

NHibernate是否可以开箱即用


干杯。

MSDN上有一篇文章,是关于我认为你想要的东西


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

与标量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>();
IEnumerable keys=GetKeys();
var query=session.CreateCriteria();
var keyCriteria=限制。析取();
foreach(var键入键)
添加(Restrictions.Eq(“id”,key));
query.Add(keyCriteria);
var result=query.List();

完美。同意应该避免使用复合键,但是对于遗留数据库还能做些什么呢?它们可以重构,例如:-)