2015-09-09 2 views
1

мне нужно проверить объект в geenric службы, если это тип сущности, я должен добавить динамическое выражение где .Where("IsDeleted==false");Как добавить выражение для общего типа?

var result = _entityRepo.All(); 

var isEntityType = typeof(Entity).IsAssignableFrom(typeof(T)); 
if (isEntityType) 
{ 
    var expression = CreateExpression("IsDeleted", true); 
    var casted = (Expression<Func<T, bool>>)expression; 
    result = result.Where(casted); 
} 
return result; 

_entityRepo является GenericRepository<T>

public static Expression CreateExpression(string propertyName, bool valueToCompare) 
{ 
    // get the type of entity 
    var entityType = typeof(Entity); 
    // get the type of the value object 
    var entityProperty = entityType.GetProperty(propertyName); 

    // Expression: "entity" 
    var parameter = Expression.Parameter(entityType, "entity"); 

    // check if the property type is a value type 
    // only value types work 
    // Expression: entity.Property == value 
    return Expression.Equal(
     Expression.Property(parameter, entityProperty), 
     Expression.Constant(valueToCompare) 
    ); 
} 

с курса я получаю ошибку на гипсе:

Невозможно лить объект типа 'System.Linq.Expressions.LogicalBinar yExpression 'на тип ' System.Linq.Expressions.Expression 1[System.Func 2 [MadCloud.Domain.Auditing.AuditCategory, System.Boolean]] '.

+3

Для этого вам не нужна и не нужна магия выражения. Просто используйте интерфейс IDeletableEntity, который объявляет свойство 'IsDeleted'. – CodeCaster

+0

Не могли бы вы рассказать больше? – Mediator

+0

Возможно, вы должны сделать его менее общим и определить BaseEntity, который поддерживает параметр IsDeleted. – MrFox

ответ

1

Предполагая IsDeleted является частью типа Entity, просто бросил на него:

IEnumerable<T> result = _entityRepo.All(); 
bool isEntityType = typeof(Entity).IsAssignableFrom(typeof(T)); 
if (isEntityType) 
{ 
    result = result.Where(x => ((Entity)(object)x).IsDeleted == true); 
} 
return result; 

В конце концов, вы знаете, что Entity является назначаемым из T, так что вы можете сделать бросок. Обратите внимание, что вам нужно отдать его сначала object, чтобы отключить проверки типа компилятора во время компиляции. См. Также this answer.

+0

Я попробовал. ошибка при сборке: не может отличать Т от типа Entity – Mediator

+0

Вы можете сделать '((Entity) (объект) x) .IsDeleted' then. – poke

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