.net - LINQ to NHibernate, "get by array of ids"查询

标签 .net linq nhibernate

代码:

 public IList<T> GetByMultipleIds(int[] ids)
 {
        List<T> result =
            _session.Linq<T>()
                .Where(x => ids.Contains(x.Id)).ToList();

        return result;
 }

抛出:
An exception of type 'System.NullReferenceException' occurred in 
NHibernate.DLL but was not handled in user code

Additional information: Object reference not set to an instance of an object.

ids={1}; T 是具有正确映射的 typeof(foo) 。

foo 表有预期的数据。

foo 继承了 entityBase,它具有名为 Id 的公共(public)虚拟 Prop 。简单的 _session.Get(ids[0]) 有效。

堆栈跟踪:
[NullReferenceException: Object reference not set to an instance of an object.]
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetEntityName(ICriteria 
subcriteria, String propertyName) +13
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetType(ICriteria 
subcriteria, String propertyName) +19
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetTypeUsingProjection
(ICriteria subcriteria, String
propertyName) +94
NHibernate.Criterion.InExpression.AssertPropertyIsNotCollection(ICriteriaQuery 
criteriaQuery, ICriteria
criteria) +19
NHibernate.Criterion.InExpression.ToSqlString(ICriteria criteria, ICriteriaQuery 
criteriaQuery, IDictionary`2 enabledFilters) +38
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition
(IDictionary`2 enabledFilters) +223
NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable 
persister, CriteriaQueryTranslator
translator, ISessionFactoryImplementor factory, CriteriaImpl criteria, String 
rootEntityName, IDictionary`2 enabledFilters) +296
NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, 
ISessionFactoryImplementor
factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary`2 
enabledFilters) +131
NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) +173
NHibernate.Impl.CriteriaImpl.List(IList results) +41
NHibernate.Impl.CriteriaImpl.List() +35

这个也不起作用:
IList<T> result =  
  (_session.Linq<T>().Where(a => new[] {1}.Contains(a.Id))).ToList();

奇怪,但是这个 作品 :
IList<foo> result =  
  (_session.Linq<foo>().Where(a => new[] {1}.Contains(a.Id))).ToList();

这个作品 也:
IList<T> result =_session.Linq<T>()
  .Where(x => 1==1).ToList();

但我需要它是通用的。

有什么想法可能是错的吗?

也许切换到 nhibernate 2.1 beta 会有所帮助?

目前是这样的:
public IList<TEntity> GetByMultipleIds(int[] ids)
    {
        //TODO: somehow query whole list at once
        List<TEntity> result = new List<TEntity>();

        foreach (var id in ids) {
            int tempId = id;
            result.Add(_session.Get<TEntity>(tempId));
        }

        return result;
    }

但这只是一个蹩脚的补丁。 :/

实际上 - 我的同事找到了使用 ICriteria 的解决方法(我稍后会添加代码)。
this允许通过 id 数组优雅地对实体进行排序。

最佳答案

该死。我忘了添加有效的解决方案:

public virtual IList<TEntity> GetByMultipleIds(int[] ids)
{
    var result = Session
      .CreateCriteria(typeof (TEntity))
      .Add(Restrictions.In("Id", ids))
      .List<TEntity>();

    result = ids.Join //to order list by passed ids
      (result, id => id, r => r.Id, (i, r) => r).ToList();

    return result;
}

关于.net - LINQ to NHibernate, "get by array of ids"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/986582/

相关文章:

c# - 将从一个 session 加载的实例保存到另一个 session 上

c# - 通过 .NET DbConnection 连接到 DB2

c# - 默认值设置为 0 的 SqlParameter 无法按预期工作

c# - 什么是 VS2013 中的 LinqToXsdSchema 构建操作?

c# - 如何从任何对象属性为 null 或空的列表中删除所有?

c# - WPF "undo"深拷贝

c# - 为什么RSACryptoServiceProvider.VerifyHash有 “hash algorithm identifier”参数?

c# - .NET Core 6 将数据库上下文注入(inject)单例服务

c# - 加入两个不同长度的列表

nhibernate - 我如何过滤我的 Lucene 搜索结果?