2014-06-06 21 views
0

通常我正在尋找解決方案來從數據庫中提取數據以填充許多表的視圖模型列表。例如,我需要你的幫助。如何編寫查詢以從視圖模型列表的某些表中提取數據?

假設我在數據庫中有CategoryProduct模型和適當的表。

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int CategoryId { get; set; } 
} 

我想從db加載Product的視圖模型列表。 ProductViewModel是這樣的:

public class ProductViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int CategoryId { get; set; } 
    public int CategoryName { get; set; } 
} 

我的SQL查詢

SELECT products.Id as Id, products.Name as Name, products.CategoryId as CategoryId, categories.Name as CategoryName 
FROM Products as products, Categories as categories WHERE products.CategoryId = categories.Id 

但是,有是沒有A類產品,因此,CategoryId == 0,(或string類型,值nullempty)。

在這種情況下,我的查詢不會加載所有產品,因爲有些產品沒有分類。

我想加載所有產品,並將emptynull的值設置爲CategoryName屬性,該屬性沒有分類。我應該如何更改我的查詢,或者如何解決類似問題?

在先進的感謝

回答

1

Left Outer Join將在這裏服務宗旨。將查詢重新寫爲:

SELECT products.Id as Id, 
     products.Name as Name, 
     products.CategoryId as CategoryId, 
     isnull(categories.Name,'') as CategoryName 
FROM Products as products 
Left Outer Join Categories as categories On products.CategoryId = categories.Id 

實際上,表之間的逗號後跟where條件中的匹配條件是ANSI SQL-89語法。它是等價的ANSI SQL-92語法是Inner Join。因此,你只需要匹配行,因爲你已經使用了這種連接。用Left Outer替換它實際上使新的匹配條件成爲:從左表(產品)獲得所有行,並從右表類別中匹配行,如果未找到匹配,則在這些行中將CategoryName添加爲Null。

相關問題