Использование метода DbFunctions с анонимным типом New Expression - PullRequest
0 голосов
/ 25 декабря 2018

Мне нужно построить выражение:

{
   t => new {
        field1 = t.field1,
        field2 = t.field2,
        dateTimeField = TruncateTime(t.dateTimeField)
     }
}

Я построил выражение:

{
     t => new {
         field1 = t.field1,
         field2 = t.field2,
         dateTimeField = t.dateTimeField
       }
 }

, используя LatticeUtilsAnonymousTypes , но я не могу обернуть t.dateTimeFieldс функцией TruncateTime.

Вот мой код:

    public static Expression<Func<T, dynamic>> GroupByExpressionAnonymous(string fields,
        string groupByDateField = null)
    {

        ISet<string> propertyNames = new HashSet<string>(fields.Split(',').Select(t => t.Trim()).ToList());

        if (!String.IsNullOrEmpty(groupByDateField))
        {
            propertyNames.Add(groupByDateField);
        }

        ParameterExpression entityParameterExpression = Expression.Parameter(typeof(T), @"t");

        var properties = typeof(T).GetProperties().Where(p => propertyNames.Contains(p.Name));

        var propertyExpressions = properties.Select(p => Expression.Property(entityParameterExpression, p));

        var anonymousType = AnonymousTypeUtils.CreateType(properties.ToDictionary(p => p.Name, p => p.PropertyType));
        var anonymousTypeConstructor = anonymousType.GetConstructors().Single();
        var anonymousTypeMembers = anonymousType.GetProperties().Cast<MemberInfo>().ToArray();

        var anonymousTypeNewExpression = Expression.New(anonymousTypeConstructor, propertyExpressions, anonymousTypeMembers);

        return Expression.Lambda<Func<T, dynamic>>(anonymousTypeNewExpression, entityParameterExpression);
    }

Как я могу использовать усечение DbFunction до одного из полей выражения в таком случае?

...