2014-12-13 2 views
0

Я пишу обобщенную Entity для Dto Mapper, и у меня есть проблема. Я хочу описать Mapping программно.C# Выражение, частично разрешающее. Curring?

public void ById(Expression<Func<TDto, object>> propertySelector, Expression<Func<TEntity, TDto, bool>> expression) { 
    // Just the Setter what will be mapped 
} 

Так что в моем я вызываю функцию ById и передаю требуемое выражение. В этом случае это сопоставление описывает, как получить список объектов, где Entity.UserId равен Dto.Id.

ById((x, y) => x.UserId.Equals(y.Id)); 

Сам backendervice также является общим и генерируется типом «TDto». Служба backends уже содержит функцию «Где», которая активирует функцию.

public List<TEntity> Where<TEntity>(Func<TEntity, bool> predicate) { 
    ObjectSet<TEntity> Column = _getGenericColumnByType(); 
    return Column.Where(predicate).ToList(); 
} 

Как обычно, я бы назвал свой бэкэнд следующим образом.

GenericBackendService<TEntity> Service = // generateMyService; 
Guid searchId = // my Guid im searching for 
var result = Service.Where(x => x.Id.Equals(searchId)); 

И теперь наступает мой вопрос. Есть ли способ разрешить вторую часть моего выражения (x, y) => x.UserId.Equals (y.Id) и создать объект func, подобный этому x => x.UserId.Equals ("123 -456-678 ")?

public Func<TEntity, bool> MagicFunction(Expression<Func<TEntity, TDto, bool>> expression) { 
    // 
    // in -> (x, y) => x.UserId.Equals(y.Id) 
    // 
    // Do the magic 
    // 
    // out ->  x => x.UserId.Equals("The Id I resolved from y.Id") 
    // 
    return function; 
} 

ответ

1

Итак, ответ ... ваша магическая функция не может работать так, как вы собираетесь.

Когда вы находитесь в своем MagicFunction, вы работаете с вашим деревом выражений. y.Id не имеет значения в этот момент времени, поэтому вы не можете его решить. Вместо этого вы должны вернуть функцию, которая может разрешить y.id, когда она имеет значение. Добавление параметра в вашу функцию значительно упрощает вещи и фактически то же самое .....

public static Func<TEntity, TDto, bool> MagicFunction(Expression<Func<TEntity, TDto, bool>> expression) 
    { 
     return expression.Compile(); 
    } 
+0

Хорошо, я вижу. Тогда мне нужно переоценить мои концепции. –

Смежные вопросы