2012-04-17 68 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

相關問題