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?
Заранее спасибо!