所以当我尝试从 Web Api 获取数据时会发生这种情况:
异常消息:
Only parameterless constructors and initializers are supported in LINQ to Entities.
这是我的服务:
public async Task<ICollection<TicketDto>> GetAllUnansweredTicketsAsync()
{
return await _context.Tickets.Include(m => m.Message)
.Include(u=>u.User)
.OrderByDescending(d=>d.Message.Date)
.Select(t => new TicketDto(t)).ToListAsync();
这就是我的 DTO 的样子:
public class TicketDto
{
public int ID { get; set; }
public string Username { get; set; }
public string Issue { get; set; }
public DateTime Date { get; set; }
public TicketDto(Ticket ticket)
{
ID = ticket.ID;
Username = ticket.User.UserName;
Issue = ticket.Message.Title;
Date = ticket.Message.Date;
}
}
有人可以解释一下如何解决这个问题吗?
最佳答案
在Linq to Entities中,您的代码在服务器端执行,但构造函数无法由提供程序转换为SQL。
您可以通过添加空构造函数并设置属性来解决问题:
...Select(t => new TicketDto
{
ID = t.ID,
Username = t.User.UserName,
Issue = t.Message.Title,
Date = t.Message.Date,
});
public class TicketDto
{
public TicketDto()
{
}
...
但是,如果您只想保留实际的构造函数,您可以切换到 Linq to Objects 调用 AsEnumerable()
:
...
.AsEnumerable()
.Select(t => new TicketDto(t))
.ToListAsync();
关于c# - 如何处理 LINQ to Entities 仅支持无参数构造函数和初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36875144/