C# сопоставление анонимного объекта в IQueryable с mapster

Я использую Entity Framework Core 2.0 и Mapster в качестве объекта отображения.

Пользователь может создавать новости в моем сценарии.

У меня есть этот метод:

public List<NewsMasterDTO> GetMasterData()
{
      IQueryable<News> news = dbcontext.News;
      IQueryable<ApplicationUser> user = dbcontext.Users;
      return news.Join(inner: user, outerKeySelector: newsDB =>   newsDB.UserId,
          innerKeySelector: applicationUser => applicationUser.Id,
          resultSelector: (newsSelector, applicationUser) =>
                           new
                           {
                            newsSelector.ID,
                            newsSelector.Date,
                            newsSelector.Image,
                            newsSelector.Headline,
                            newsSelector.Text,
                            Author= applicationUser.UserName
                           }).ToList();
}

который работает как я хочу. Но вместо того, чтобы писать мои выбранные свойства вручную, я хочу использовать mapster. Поэтому у меня есть этот класс:

  public class NewsMasterDTO
  {
    public int ID { get; set; }
    public string Headline{ get; set; }
    public byte[] Image{ get; set; }
    public string Text { get; set; }
    public DateTime Date{ get; set; }
    public string Author{ get; set; }
  }

и попробовал что-то вроде этого:

 public List<NewsMasterDTO> GetMasterData()
    {
          IQueryable<News> news = dbcontext.News;
          IQueryable<ApplicationUser> user = dbcontext.Users;
          return news.Join(inner: user, outerKeySelector: newsDB =>   newsDB.UserId,
              innerKeySelector: applicationUser => applicationUser.Id,
              resultSelector: (newsSelector, applicationUser) =>
                               new
                               {
                                newsSelector,
                                Author= applicationUser.UserName
                               })
                               .ProjectToType<NewsMasterDTO>()
                               .ToList();
    }

Но это не работает. Мой SQL-Profiler показывает мне это:

SELECT applicationUser.UserName as author
FROM News
INNER JOIN Users ON News.AuthorId = Users.ID;

Так что он не проецирует свойства из NewsMasterDTO.

Если я напишу это так:

 public List<NewsMasterDTO> GetMasterData()
    {
          IQueryable<News> news = dbcontext.News;
          IQueryable<ApplicationUser> user = dbcontext.Users;
          return news.Join(inner: user, outerKeySelector: newsDB =>   newsDB.UserId,
              innerKeySelector: applicationUser => applicationUser.Id,
              resultSelector: (newsSelector, applicationUser) => newsSelector)

                               .ProjectToType<NewsMasterDTO>()
                               .ToList();
    }

выбор свойств работает, но объединение для получения имени пользователя - нет. SQL-Profiler показывает что-то вроде этого:

SELECT id, headline, image, text, date
FROM News
INNER JOIN Users ON News.AuthorId = Users.ID;

Но, как видите, автор в SELECT отсутствует...

Есть ли способ достичь моей цели, чтобы я мог описать свои выбранные свойства в своем классе NewsMasterDTO вместо того, чтобы записать это в явном результате resultSelector?

Заранее спасибо!

0 ответов

Другие вопросы по тегам