使用NHibernate通过单个查询和复合键检索一组记录
我正在使用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)
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();
完美。同意应该避免使用复合键,但是对于遗留数据库还能做些什么呢?它们可以重构,例如:-)