/// <summary> /// 使用主键批量获取对象集合。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="session"></param> /// <param name="ids"></param> /// <returns></returns> public static IList <T> GetList <T>(this ISession session, IEnumerable ids) { CacheLoader loader = new CacheLoader(); var entityPersister = session.GetSessionImplementation().GetEntityPersister(typeof(T).FullName, null); var entityName = typeof(T).FullName; var eventSource = (IEventSource)session; var loadType = LoadEventListener.Get; List <T> output = new List <T>(); ArrayList missings = new ArrayList(); foreach (object id in ids) { EntityKey entityKey = new EntityKey(id, entityPersister, EntityMode.Poco); LoadEvent loadEvent = new LoadEvent(id, entityName, false, eventSource); var entity = loader.LoadFromSessionCache(loadEvent, entityKey, loadType); if (entity == null) { entity = loader.LoadFromSecondLevelCache(loadEvent, entityPersister, loadType); } if (entity != null) { output.Add((T)entity); } else { missings.Add(id); } } if (missings.Count > 0) { //对组合键进行处理 if (entityPersister.IdentifierType.IsComponentType) { ComponentType idType = (ComponentType)entityPersister.IdentifierType; List <HashSet <object> > props = new List <HashSet <object> >(); foreach (string name in idType.PropertyNames) { props.Add(new HashSet <object>()); } foreach (var missing in missings) { var values = idType.GetPropertyValues(missing, EntityMode.Poco); for (int i = 0; i < values.Length; i++) { props[i].Add(values[i]); } } var cr = session.CreateCriteria(entityName); //合并为查询 int index = 0; foreach (HashSet <object> set in props) { string propName = entityPersister.IdentifierPropertyName + "." + idType.PropertyNames[index]; if (set.Count == 1) { cr = cr.Add(Expression.Eq(propName, set.First())); } else { cr = cr.Add(Expression.In(propName, set.ToArray())); } index++; } output.AddRange(cr.List <T>()); } else { output.AddRange(session.CreateCriteria(entityName) .Add(Expression.In(entityPersister.IdentifierPropertyName, missings)) .List <T>()); } } return(output); }