Esempio n. 1
0
        /// <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);
        }