2012-02-03 59 views
0

我試圖使用WebGrid HtmlHelper來顯示來自幾個實體的數據。 WebGrid的源由linq查詢準備:var query = db.Orders.Include(o => o.OrderStatus)。 我能夠顯示來自兩個實體的彙總數據,它工作正常。如何構建正確的LINQ到實體查詢從多個實體獲取數據(左外連接模擬)

但在另一種情況下,當我試圖做同樣的事情,但與另一組數據我得到了我無法解決的問題。

我的控制器查詢:

var query = db.SerNum.Include(o => o.Orders).Include(o => o.Item) 

我查看的WebGrid:

@grid.GetHtml(columns: grid.Columns(
grid.Column("Item.Name", "Item Name"), 
grid.Column("Price", "Price"), 
grid.Column("Order.shpOrderID", "Order ID"), 
grid.Column("SellDate", "Date") 
)) 

當我調試項目中,我得到一個錯誤。無法顯示

的WebGrid - Item.Name和Order.shpOrderID不存在

這是因爲不是所有的SerNum在訂單和項目表鏈接的記錄。有人可以告訴我如何解決這個問題嗎?

+1

你將不得不更新您的LINQ查詢,但變化取決於你想要達到的目標。你只**想要顯示在Order和Item表中有一個條目的SerNum記錄,或者是否想要像現在這樣顯示** all **記錄,但是使用「Item Name」和「Order ID」列空白? – Nope 2012-02-03 15:55:34

+0

我需要顯示SerNum中的所有行。 – intox 2012-02-03 16:48:07

回答

1

我會建議使用一個DTO,一個沒有被跟蹤並且與EF沒有關係的POCO。這個DTO對象將匹配你的網格所需的數據,將被稱爲ProductGridView。這將使您的查詢更有效率的廣告,您在LINQ中使用的每個.Include()都會選擇該表中的每一列數據。下面是一個簡單的例子,只要記住我不知道該怎麼對你的實體屬性的樣子:

puclic class ProductGridView { 
    public string ItemName {get; set;} 
    public double Price {get; set;} 
    public int OrderId {get; set;} 
    public DateTime SellDate {get; set;} 
} 

現在可以更改您的鏈接查詢,像這樣:

var results = db.SerNum.Include(o => o.Orders).Include(o => o.Item) 
       .Select(x => new ProductGridView{ 
        ItemName = x.Item.Name, 
        ...Rest Of Mapping... 
       }).ToList(); 

你可以現在將這些結果返回給您的網格,它應該可以工作並且效率會更高。

這裏是DTO的一些信息:http://rlacovara.blogspot.com/2009/03/what-is-difference-between-dto-and-poco.html

+0

很感謝,保羅。你的建議有效!當需要處理來自多個實體的數據時,我發現它非常有用。我擔心的一件事是應該有更簡單的解決方案,而不會增加應用程序的複雜性。例如 - 當VS自動爲包含一些鏈接實體的數據模型構建控制器和視圖時,不需要額外的結構即使使用空值顯示來自不同實體的值的簡單行列表。 – intox 2012-02-06 08:32:25

+0

有像AutoMapper這樣的工具可以使映射DTO變得更簡單,但我同意這種解決方案有更多的複雜性。我通常只對複雜模型或高流量站點執行此操作。 – Paul 2012-02-06 16:59:53