通常我正在寻找一种从数据库中提取数据的解决方案,以填充我的许多表的视图模型列表。例如,我需要你帮助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; }
}
我的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
类型,值为null
或empty
)。
在这种情况下,我的查询不会加载所有产品,因为某些产品没有类别。
我想加载所有产品,并将empty
或null
值提供给CategoryName
属性,这些属性没有类别。我该如何更改查询或如何解决类似的问题?
先谢谢
答案 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那些行。