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