Linq To Entities 中的左外部联接(不能在 LINQ to Entities 查询中构造实体或复杂类型)

本文关键字:Entities 查询 实体 to 复杂 类型 LINQ 不能 To 外部 Linq | 更新日期: 2023-09-27 18:31:20

我有两个类映射我的数据库的两个表:

public class Product
{
    public int Id { get; set; }
    public string Token { get; set; }
    public string Name { get; set; }
    public decimal Value { get; set; }
}
public class Ticket
{
    public int Id { get; set; }
    public string SerialNumber { get; set; }
    public string ProductToken { get; set; }
    public Product Product { get; set; }
}

由于某些域原因,产品和票证在逻辑上是链接的,换句话说,它们没有在可由 EF 映射的数据库关系中链接,它们将在我的应用程序中与"必须"在 SQL 外部左联接中转换的 linq 查询链接。由此,我进行了以下查询:

IQueryble<Ticket> query = from ts in context.Tickets
                          join ps in context.Products 
                               on ts.ProductToken equals ps.Token into p
                          select new Ticket
                          {
                              Id = t.Id,  
                              SerialNumber = t.SerialNumber,
                              ProductToken = t.ProductToken,
                  Goal -----> Product = p.FirstOrDefault()
                          };

查询保持为 IQueryble,因为在此之后,查询将继续使用过滤器进行优化。

问题是当我运行以下代码时:

var tickets = query.OrderBy(t => t.SerialNumber).ToList();

我收到以下错误:

"The entity or complex type 'Model.Ticket' cannot be constructed in a LINQ to Entities query."

那么,我怎样才能实现我的目标呢?

Linq To Entities 中的左外部联接(不能在 LINQ to Entities 查询中构造实体或复杂类型)

不能将结果投影到映射的实体,也可以将其投影到匿名类型或创建自己的票证类型,如下所示:

public class myTicket
{
    public int Id { get; set; }
    public string SerialNumber { get; set; }
    public string ProductToken { get; set; }
    public Product Product { get; set; }
}

然后:

IQueryble<myTicket> query = from ts in context.Tickets
                          join ps in context.Products 
                               on t.ProductToken equals p.Token into p
                          select new myTicket
                          {
                              Id = t.Id,  
                              SerialNumber = t.SerialNumber,
                              ProductToken = t.ProductToken,
                              Product = p.FirstOrDefault()
                          };

此外,还需要使用 DefaultIfEmpty() 进行左外连接