【问题标题】:How write query to pull data from some tables for view model lists?如何编写查询以从视图模型列表的某些表中提取数据?
【发布时间】:2014-06-06 07:34:07
【问题描述】:

一般来说,我正在寻找一种解决方案来从数据库中提取数据以填充我的视图模型列表以用于许多表。例如,我需要你的帮助来处理 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 属性,这些属性没有类别。我应该如何更改我的查询或如何解决类似的问题?

在此致谢

【问题讨论】:

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


    【解决方案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 实际上使新的匹配条件为:从左表(产品)中获取 all 行并从右表类别中获取匹配行,如果找不到匹配项,则将 CategoryName 添加为 Null那些行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-06
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 2017-08-27
      相关资源
      最近更新 更多