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); }
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); }