一般我正在寻找一个解决方案,从数据库拉数据,以填补我的视图模型列表的许多表。例如,我需要你帮助2张桌子。
假设数据库中有Category
和Product
模型和相应的表。
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
类型,值为null
或empty
)。
在本例中,我的查询没有加载所有产品,因为有些产品没有类别。
我想加载所有的产品,并给empty
或null
值CategoryName
属性,它没有类别。我应该如何更改我的查询或如何解决类似的问题?
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。