2

Я пытаюсь получить конфигурацию автоматической декомпиляции для DelegateDecompiler работать, как показано здесь: http://daveaglick.com/posts/computed-properties-and-entity-framework Но он не работает :(Невозможно получить конфигурацию ShouldDecompile в DelegateDecompiler работать

Не уверен, что я «м делают неправильно.

Вот класс, который имеет вычисленное значение.

public class Person 
{ 
    public int Id { get; set; } 
    public string First { get; set; } 
    public string Last { get; set; } 

    [NotMapped] 
    [Computed] 
    public string Full { get { return First + " " + Last; } } 
} 

Это конфигурация.

public class DelegateDecompilerConfiguration : DefaultConfiguration 
{ 
    public override bool ShouldDecompile(MemberInfo memberInfo) 
    { 
     // Automatically decompile all NotMapped members 
     return base.ShouldDecompile(memberInfo) || memberInfo.GetCustomAttributes(typeof(NotMappedAttribute), true).Length > 0; 
    } 
} 

Я также попытался удалить [NotMapped], а затем сменил typeof(NotMappedAttribute) на typeof(ComputedAttribute) в вышеуказанной конфигурации.

Тогда я зарегистрировать его как так

DelegateDecompiler.Configuration.Configure(new DelegateDecompilerConfiguration()); 

В Startup.cs. Я также попытался поместить его прямо в свое действие.

public ActionResult Test() 
{ 
    DelegateDecompiler.Configuration.Configure(new DelegateDecompilerConfiguration()); 

    var ctx = new ApplicationDbContext(); 
    var result = ctx.People.Where(x => x.Full.Contains("foo bar")).ToList(); 

    return View(); 
} 

Ни работа :(

Если я ставлю .Decompile() на запрос, то он работает, как ожидалось. Так DelegateDecompiler работает, но не конфигурацию.

ответ

4

Как вы обнаружили в вашем вопросе GitHub , вы всегда должны вызывать .Decompile() в запросе LINQ. Дополнительная конфигурация просто исключает необходимость украшения всех ваших вычисляемых свойств атрибутом Computed, вместо этого полагаясь на атрибут Entity Framework NotMapped.

2

Как Дэйв говорит, что это требует Decompile()

Так что вам не нужно помнить, чтобы назвать его можно создать расширение картографа, который оборачивает, что вы делаете.

public static class MapperExtensions 
{ 
    /// <summary> 
    /// Creates a list from automapper projection. Also wraps delegate decompiler to supprt Computed Domain properties 
    /// </summary> 
    /// <typeparam name="TDestination"></typeparam> 
    /// <param name="projectionExpression"></param> 
    /// <returns></returns> 
    public static List<TDestination> 
     ToList<TDestination>(this IProjectionExpression projectionExpression) 
    { 
     return projectionExpression.To<TDestination>().Decompile().ToList(); 
    } 
}