如何处理 LINQ to Entities 仅支持无参数构造函数和初始值设定项

Iva*_*anD 3 c# linq ajax entity-framework

因此,当我尝试从 Web Api 获取数据时,就会发生这种情况:

异常消息:

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();
Run Code Online (Sandbox Code Playgroud)

这就是我的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下如何解决这个问题吗?

Art*_*aca 5

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()
    {
    }
    ...
Run Code Online (Sandbox Code Playgroud)

但如果您只想保留实际的构造函数,您可以切换到Linq to Objects调用AsEnumerable()

...
.AsEnumerable()
.Select(t => new TicketDto(t))
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)