Exemplo n.º 1
0
        private static Criteria ParseCriteria(JArray filters, PagingInfo pagingInfo)
        {
            JObject jUseCriteriaType = filters[0] as JObject;
            var     clientTypeName   = jUseCriteriaType.Property("value").Value.ToString();
            var     criteriaMeta     = ClientEntities.Find(clientTypeName);

            if (criteriaMeta == null)
            {
                throw new NotSupportedException("criteriaType");
            }

            var jCriteria = filters[1] as JObject;

            if (!jCriteria.Property("property").Value.ToString().Contains("_criteria"))
            {
                throw new NotSupportedException();
            }
            var jCriteriaValues = jCriteria.Property("value").Value as JObject;

            //创建一个 Criteria 并设置它的相关属性值
            var criteria = Entity.New(criteriaMeta.EntityType) as Criteria;

            if (criteria == null)
            {
                throw new InvalidProgramException("在 Web 开发模式下,查询条件类,必须继承自 Criteria 类型。");
            }

            var setter = new EntityPropertySetter(criteriaMeta);

            setter.SetEntity(criteria, jCriteriaValues);

            criteria.PagingInfo = pagingInfo;

            return(criteria);
        }
Exemplo n.º 2
0
        internal IEnumerable <T> ProcessEntities <T, TBase>(IDataContext db, IEnumerable <T> entities)
            where TBase : class
            where T : class, TBase
        {
            var baseType = typeof(TBase);
            var desc     = db.MappingSchema.GetEntityDescriptor(baseType);

            var pkFields = from x in desc.Columns
                           where x.IsPrimaryKey
                           orderby x.PrimaryKeyOrder
                           select x.MemberName;

            if (!pkFields.Any())
            {
                return(entities);
            }

            var pkHasher = _typeHasCodeCache.GetOrAdd(baseType, k =>
            {
                var func = EntityPropertySetter.CreateHashCodeExpression <TBase>(pkFields);
                return(new BaseTypeHashCode <TBase>(func));
            });

            var pkTypeHaster = pkHasher as BaseTypeHashCode <TBase>;
            var pkFunc       = pkTypeHaster.HashCodeFunc;

            if (!_typeBag.ContainsKey(baseType))
            {
                _typeBag.Add(baseType, new TypePoolDict <TBase>() as ITypePool);
            }


            var typePoolDict    = _typeBag[baseType] as TypePoolDict <TBase>;
            var entitiesAndKeys = entities.Select(x => new { Key = pkFunc(x), Entity = x }).ToList();
            var lookup          = entitiesAndKeys.ToLookup(x => x.Key, x => x.Entity);

            foreach (var grouping in lookup)
            {
                if (!typePoolDict.ContainsKey(grouping.Key))
                {
                    typePoolDict[grouping.Key] = grouping.First();
                }
            }

            var deDupeData = entitiesAndKeys.Select(l => typePoolDict[l.Key]).OfType <T>().ToList();

            return(deDupeData);
        }