【问题标题】:Using NHibernate to retrieve a set of records with a single query and composite keys使用 NHibernate 通过单个查询和复合键检索一组记录
【发布时间】:2012-08-19 13:03:45
【问题描述】:

我正在使用 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 是否可以开箱即用?

干杯。

【问题讨论】:

    标签: nhibernate composite-key


    【解决方案1】:

    与标量 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>();
    

    【讨论】:

    • 完美。同意应该避免使用复合键,但是对于遗留数据库还能做什么?
    • 它们可以被重构,例如:-)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-16
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2010-11-02
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      相关资源
      最近更新 更多