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