2012-04-17 70 views
0

我有两个类映射我的数据库的两个表:左外连接的实体(实体或复杂类型不能在LINQ到实体查询构造。)

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; } 
} 

对于某些领域的原因,Product和Ticket在逻辑上是链接的,换句话说,它们没有链接到可以由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() 
          }; 

该查询保持为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." 

那么,怎样才能达到我我的目标?

回答

5

不能将结果投影到映射的实体,或者是你可以把它投射到一个annonymous类型或创建自己的机票类型是这样的:

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()左外连接

+0

不错的作品,只是一个注意事项,你错过了序号:) – mattytommo 2012-04-17 17:02:14

+0

我不明白为什么我有创建一个与POCO类相同的新类,并且如果您在选择返回中创建“new myTicket”,为什么IQueryble保持相同(Ticket),它将运行,需要一些转换? – 2012-04-17 17:04:50

+0

@ViniciusOttoni,IQueryable 是一个错字,它应该是myTicket那里,你不能投影到映射实体的原因是因为一个实体代表一个数据库表。使用项目你选择了一部分表格(一些列),这对于数据来说是无效的状态 – Habib 2012-04-17 17:07:26

相关问题