Есть ли способ применить приведение типов в Queryable SQL с помощью дерева выражений - PullRequest
0 голосов
/ 08 апреля 2019

Как я могу использовать приведение типов в коллекции Queryable, которая содержит запрос Sql в ядре .net.Мое выражение следующее, которое сейчас возвращает только строковое значение, но я хочу вернуть значение в соответствии с переданным ему типом данных.

Я пробовал Expression.Convert типа для Expression.Property , ноэто не поддерживается в Sql.

Ниже приведено мое выражение, где TSource является источником, который содержит свойство, содержащее строковое значение, а TDataType является типом данных, который необходимо преобразовать в.

public static Expression<Func<TSource, TDataType>> CreateMapFromExpression<TSource, TDataType>(string fieldName, TypeCode dataType)
{
    var parameterExpression = Expression.Parameter(typeof(TSource));

    var collectionParameter = Expression.Property(parameterExpression, "CustomFieldValues");
    var childType = collectionParameter.Type.GetGenericArguments()[0];
    var propertyParameter = Expression.Parameter(childType, childType.Name);

    var left = Expression.Property(propertyParameter, "Name");
    var right = Expression.Constant(fieldName);

    var innerLambda = Expression.Equal(left, right);

    var innerFunction = Expression.Lambda(innerLambda, propertyParameter);

    var method = typeof(Enumerable).GetMethods().Where(m => m.Name == "FirstOrDefault" && m.GetParameters().Length == 2).FirstOrDefault().MakeGenericMethod(typeof(CustomFieldValue));

    var outerLambda = Expression.Call(method, Expression.Property(parameterExpression, collectionParameter.Member as System.Reflection.PropertyInfo), innerFunction);
    var propertyGetter = Expression.Property(outerLambda, "Value");            

    var result = Expression.Lambda<Func<TSource, TDataType>>(propertyGetter, new ParameterExpression[] { parameterExpression });
    return result;
}
...