如何编写查询以从视图模型列表的某些表中提取数据?

时间:2014-06-06 07:34:08

标签: sql sql-server-2008 join viewmodel jointable

通常我正在寻找一种从数据库中提取数据的解决方案,以填充我的许多表的视图模型列表。例如,我需要你帮助2张桌子。

假设我在数据库中有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

但是,有一些产品没有类别,因此,CategoryId == 0,(或string类型,值为nullempty)。

在这种情况下,我的查询不会加载所有产品,因为某些产品没有类别。

我想加载所有产品,并将emptynull值提供给CategoryName属性,这些属性没有类别。我该如何更改查询或如何解决类似的问题?

先谢谢

1 个答案:

答案 0 :(得分: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语法是内部连接。所以你只是匹配行,因为你已经使用过这样的连接。用Left Outer替换它实际上使新的匹配条件为:从Left table(Products)获取所有行并从右表Category中匹配行,如果没有找到匹配,则将CategoryName添加为Null in那些行。