コード例 #1
0
        internal MemberExpression?GetJoinPropertyExpression(Expression source, Expression parameter, IReadOnlyList <IEdmNavigationProperty> joinPath, IEdmProperty edmProperty)
        {
            Expression?propertyExpression = GetJoinPropertyExpression(parameter, joinPath);

            if (propertyExpression == null)
            {
                return(null);
            }

            PropertyInfo?propertyInfo = propertyExpression.Type.GetPropertyIgnoreCaseOrNull(edmProperty);

            if (propertyInfo != null)
            {
                return(Expression.Property(propertyExpression, propertyInfo));
            }

            if (OeExpressionHelper.IsPrimitiveType(propertyExpression.Type))
            {
                return((MemberExpression)propertyExpression);
            }

            var propertyTranslator = new OePropertyTranslator(source);

            return(propertyTranslator.Build(propertyExpression, edmProperty));
        }
コード例 #2
0
        private static MemberExpression FindInGroupByKey(Expression source, Expression key, MemberExpression propertyExpression)
        {
            if (propertyExpression.Expression is MemberExpression)
            {
                var propertyTranslator = new OePropertyTranslator(source);
                return(propertyTranslator.Build(key, (PropertyInfo)propertyExpression.Member));
            }

            return(null);
        }
コード例 #3
0
        private static OePropertyAccessor[] GetAccessors(Type clrEntityType, IEdmEntitySetBase entitySet, IReadOnlyList <OeSelectItem> selectItems, Expression source)
        {
            if (selectItems.Count == 0)
            {
                return(OePropertyAccessor.CreateFromType(clrEntityType, entitySet));
            }

            var accessorList = new List <OePropertyAccessor>(selectItems.Count);

            ParameterExpression accessorParameter      = Expression.Parameter(typeof(Object));
            UnaryExpression     typedAccessorParameter = Expression.Convert(accessorParameter, clrEntityType);

            for (int i = 0; i < selectItems.Count; i++)
            {
                IEdmProperty     edmProperty = selectItems[i].EdmProperty;
                MemberExpression propertyExpression;
                if (edmProperty is ComputeProperty computeProperty)
                {
                    propertyExpression = OeExpressionHelper.GetPropertyExpressions(typedAccessorParameter)[i];
                }
                else
                {
                    PropertyInfo clrProperty = clrEntityType.GetPropertyIgnoreCase(edmProperty);
                    if (clrProperty == null)
                    {
                        propertyExpression = new OePropertyTranslator(source).Build(typedAccessorParameter, edmProperty);
                        if (propertyExpression == null)
                        {
                            throw new InvalidOperationException("Property " + edmProperty.Name + " not found");
                        }
                    }
                    else
                    {
                        propertyExpression = Expression.Property(typedAccessorParameter, clrProperty);
                    }
                }
                accessorList.Add(OePropertyAccessor.CreatePropertyAccessor(edmProperty, propertyExpression, accessorParameter, selectItems[i].SkipToken));
            }

            return(accessorList.ToArray());
        }