Учитывая следующее:Использование AutoMapper с EF Code First присоединяется во время совместного отображения
public class Foo
{
public Int32 Foo_PK { get; set; }
public String SomeProperty { get; set; }
}
public class Bar
{
public Int32 Bar_PK { get; set; }
public Int32 Foo_FK { get; set; }
public String SomeOtherProperty { get; set; }
}
public class JoinResult<TEntity, TJoiningEntity>
{
public TEntity From { get; private set; }
public TEntity To { get; private set; }
public JoinResult(TEntity from, TEntity to)
{
this.From = from;
this.To = to;
}
}
public interface IFooResult
{
public String SomeProperty { get; set; }
}
public interface IBarResult : IFooResult
{
public String SomeOtherProperty { get; set; }
}
public class FooResultDTO : IFooResult, IBarResult
{
public String SomeProperty { get; set; }
public String SomeOtherProperty { get; set; }
}
Идея заключается в том, что мы какой-то способ выдачи Foo-х и Foo с другими связанными записями, например, если в таблице есть 4 бара, а 4 строки в таблице с дополнительными полями.
public class FooDispensary
{
public IQueryable<T> Dispense<T>()
where T: IFooResult
{
using (var repository = new Repository())
{
// TODO: Handle mapping for Foo -> FooResult
// Project to
return repository.Foos.ProjectTo<FooResultDTO>();
}
}
public IQueryable<T> DispenseWithBars<T>()
where T : IFooResult, IBarResult
{
using (var repository = new Repository())
{
// TODO: Handle mapping for JoinResult.From (same as Foo -> FooResult) as well as to JoinResult.To
// Project to
return repository.Foos.Join((f) => f.Foo_PK,
(b) => b.Foo_FK,
(f, b) => new JoinResult<Foo, Bar>(f, b))
.ProjectTo<FooResultDTO>();
}
}
}
Однако, я бы в идеале, как только указать базовое отображение раз (Foo -> IFooResult), а затем повторно использовать это в методах, где мы должны присоединиться к дочерней таблице.
Существует несколько причин, требующих сделать это, которые являются специфическими для моего проекта, но не нужно вдаваться в них, мне просто интересно, возможно ли это, поскольку я боролся с синтаксисом до сих пор?
Благодаря
Спасибо за ответ, я хочу сказать, что хотя я сопоставляю * с * JoinResult 'отображение между Foo (' (r) => r.From') и 'IFooResult' останется неизменным, поэтому я хотел бы повторно использовать это, если смогу. Имейте в виду, что приведенное выше является лишь простым примером для того, чтобы сохранить вопрос таким образом, что его легко понять, в базовом классе могут быть 10 свойств, все из которых отображаются в разных местах. –
LukeHennerley
@ LukeHennerley Я понимаю, о чем вы просите, но я не уверен, что это возможно из-за использования 'JoinResult <>'. Одна из возможностей, которую вы можете попробовать, - сначала вытащить обратно Foo, проецируя их в DTO, а затем запросить бары и проецировать их в DTO. Это позволит вам повторно использовать сопоставления, определенные ранее, но, очевидно, за счет эффективности запросов. – chambo
@ LukeHennerley Извините, я не могу больше помочь. Я поставил бы вопрос на форуме Automapper. Вы можете получить лучший ответ: https://groups.google.com/forum/#!forum/automapper-users – chambo