有什么方法可以使用表达式树在Queryable sql中应用类型转换

时间:2019-04-08 10:28:32

标签: c# sql casting .net-core expression

如何在Queryable集合中使用类型转换,该集合在.net核心中包含Sql查询。我的表达式如下,该表达式现在仅返回字符串值,但是我想根据传递给它的数据类型返回值。

我尝试过Expression.Convert type for 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;
}

0 个答案:

没有答案