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



一般我正在寻找一个解决方案,从数据库拉数据,以填补我的视图模型列表的许多表。例如,我需要你帮助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; }
}

My sql query is

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)。

在本例中,我的查询没有加载所有产品,因为有些产品没有类别。

我想加载所有的产品,并给emptynullCategoryName属性,它没有类别。我应该如何更改我的查询或如何解决类似的问题?

Thanks in advanced

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实际上使新的匹配条件为:从左表(Products)中获取所有行,并从右表Categories中匹配行,如果没有找到匹配,则在这些行中添加CategoryName为Null。

相关内容

  • 没有找到相关文章

最新更新