Linq To Entities中的左外连接(无法在LINQ to Entities查询中构造实体或复杂类型.)

Vin*_*oni 0 c# linq linq-to-entities outer-join

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

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

由于某些域名原因,产品和故障单在逻辑上是链接的,换句话说,它们没有链接在可由EF映射的数据库关系中,它们将在我的应用程序中链接一个"必须"翻译成的linq查询SQL外左连接.从这里,我做了以下查询:

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

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

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

var tickets = query.OrderBy(t => t.SerialNumber).ToList();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

"The entity or complex type 'Model.Ticket' cannot be constructed in a LINQ to Entities query."
Run Code Online (Sandbox Code Playgroud)

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

Hab*_*bib 5

您无法将结果投影到映射的实体,您可以将其投影为匿名类型,也可以创建自己的Ticket类型:

public class myTicket
{
    public int Id { get; set; }
    public string SerialNumber { get; set; }
    public string ProductToken { get; set; }
    public Product Product { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

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

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