Codice:LINQ to NHibernate, "get dalla matrice di ID" di query
public IList<T> GetByMultipleIds(int[] ids)
{
List<T> result =
_session.Linq<T>()
.Where(x => ids.Contains(x.Id)).ToList();
return result;
}
Produce:
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) che ha una mappatura corretta.
la tabella foo ha i dati previsti.
foo eredita entityBase che dispone di supporto virtuale pubblico denominato ID. simple _session.Get (ids [0]) funziona.
Stack trace:
[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
Questo non funziona neanche:
IList<T> result =
(_session.Linq<T>().Where(a => new[] {1}.Contains(a.Id))).ToList();
Strano, ma questo funziona:
IList<foo> result =
(_session.Linq<foo>().Where(a => new[] {1}.Contains(a.Id))).ToList();
Questo funziona troppo:
IList<T> result =_session.Linq<T>()
.Where(x => 1==1).ToList();
Ma ho bisogno di essere generico.
Qualche idea cosa potrebbe essere sbagliato?
Forse passare a nibernare 2.1 beta potrebbe essere d'aiuto?
Al momento è come questo:
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;
}
Ma questa è solo una patch zoppo. :/
In realtà - il mio collega trovato una soluzione utilizzando ICriteria (io aggiungere codice in seguito).
E this consente di ordinare le entità con la matrice id in modo elegante.
2.1 Help 2.1? –
Non sarà, non ancora del tutto ... la stima è ancora che faccia il 2.1 GA ma non è nella beta, per riferimento ecco l'ultimo post di blog sullo stato: http://nhforge.org/blogs/ NHibernate/archive/2009/06/11/LINQ to NHibernate-update.aspx –