2015-12-23 2 views
2

Давайте возьмем такие классы:C# AutoMapper ProjectTo выбирает все вложенные свойства объекта

public class Child 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string ExtraProp { get; set; } 
} 

public class Parent 
{ 
    public int Id { get; set; } 
    public string Text { get; set; } 
    public Child Child { get; set; } 
    public string ParentExtraProp { get; set; } 
} 

public class ChildVo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class ParentVo 
{ 
    public int Id { get; set; } 
    public string Text { get; set; } 
    public ChildVo Child { get; set; } 
} 

Automapper отображения:

Mapper.CreateMap<Child, ChildVo>(); 
//.ForSourceMember(x => x.ExtraProp, o => o.Ignore()); //does not help 
//.IgnoreAllNonExisting(); //does not help 

Mapper.CreateMap<Parent, ParentVo>(); 

и запросов в Linq для NHibernate:

var test = Session.Query<Parent>() 
      .Where(x => x.Id == myId) 
      .ProjectTo<ParentVo>() 
      .ToList(); 

ProjectTo выбирает только столбцы (свойства), которые определены в ParentVo (не все свойства класса Parent) - это здорово. Но выбирает все столбцы (свойства) из моего класса Child, несмотря на то, что они не определены в ChildVo. Почему Automapper игнорирует мое вложенное сопоставление свойств? Можно ли использовать все определенные отображения во время проекции?

ответ

1

Хотя я не знаком с nhibernate, тот же тест, который вы здесь выполнили, отлично работает в Entity Framework. В EF вы можете увидеть запрос, который был сгенерирован перед его исполнением, - попробуйте сделать это и посмотреть, показывает ли он дополнительный столбец.

public class TestContext : DbContext { 
    public DbSet<Parent> Parents { get; set; } 
} 

var query = testContext.Parents.ProjectTo<ParentVo>(); 
Console.WriteLine(query.ToString()); 

Это дает следующий результат (обратите внимание, не ExtraProp):

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Text] AS [Text], 
    CASE WHEN ([Extent2].[Id] IS NOT NULL) THEN 1 END AS [C1], 
    [Extent1].[Child_Id] AS [Child_Id], 
    [Extent2].[Name] AS [Name] 
    FROM [dbo].[Parents] AS [Extent1] 
    LEFT OUTER JOIN [dbo].[Children] AS [Extent2] ON [Extent1].[Child_Id] = [Extent2].[Id] 

Это заставляет меня думать, что проблема не AutoMapper конкретно, но не видя сгенерированного запроса, трудно сказать.

+0

Спасибо. Любое обходное решение для использования mappigs в таких запросах? – pgram

+0

Не уверен, что вы имеете в виду. 'ProjectTo <>()' будет использовать сопоставления для генерации запросов. – Richard

+0

Я хотел бы заставить linq/nh/automapper использовать вложенные сопоставления в проекциях (запретить select * из child). ProjectTo <>() реализует только родительский объект. – pgram

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