0

我使用实体框架核心 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 中显式地编写它?

先感谢您!

4

0 回答 0