19

在项目中我有这个表:

  1. 产品(id,catalogId,manufacturerId...)
  2. 目录
  3. 制造商

还有Product型号(id, name, catalogId, catalogTitle, manufacturerId, manufacturerName)

如果我想获取产品项目,如何在下面的 Linq 中编写这个 SQL 查询?

SELECT Product.Name, Product.CatalogId, Product.ManufacturerId, [Catalog].Name, Manufacturer.Name
FROM Product, [Catalog], Manufacturer
WHERE [Catalog].Id=Product.CatalogId AND Manufacturer.id=Product.ManufacturerId AND Product.Active=1
4

2 回答 2

52

首先,我会回答您的问题..然后解决您对评论的回答。要回答您的问题,在 Linq 中您将执行以下操作:

from p in Product
join c in Catalog on c.Id equals p.CatalogId
join m in Manufacturer on m.Id equals p.ManufacturerId
where p.Active == 1
select new { Name = p.Name, CatalogId = p.CatalogId, ManufacturerId = p.ManufacturerId, CatalogName = c.Name, ManufacturerName = m.Name };

这将为您提供一个匿名对象,其中包含您请求的项目。如果您需要在其他地方使用它(并且您没有使用动态对象),我建议您创建一个视图模型,并在您的选择中实例化其中一个。

例子:

public class ProductInfoView 
{
     public string Name { get; set; }
     public int CatalogId { get; set; }
     public int ManufacturerId { get; set; }
     public string CatalogName { get; set; }
     public string ManufacturerName { get; set; }
}


from p in Product
join c in Catalog on c.Id equals p.CatalogId
join m in Manufacturer on m.Id equals p.ManufacturerId
where p.Active == 1
select new ProductInfoView() { Name = p.Name, CatalogId = p.CatalogId, ManufacturerId = p.ManufacturerId, CatalogName = c.Name, ManufacturerName = m.Name };

这将使引用您的查询结果不那么痛苦。

为了回答您的评论,如果您想要的只是产品,那么您正在做很多连接。您的标准只能确保三件事

  1. 您的产品的活动标志为 1
  2. 您的产品有一个现有的目录条目
  3. 您的产品有一个现有的制造商条目

如果 #2 和 #3 是多余的并且您不一定需要名称,您可以简单地执行以下操作:

from p in Product
where p.Active == 1
select p

如果 Product 是 CRUD 模型,您可能会对其进行深度加载以包含制造商/目录信息,或使用上述视图模型。

祝你好运!

于 2012-09-09T14:20:33.543 回答
9

要在没有显式连接的情况下组合来自多个表的结果:

from p in Product
from c in Catalog
from m in Manufacturer
where c.Id == p.CatalogId && m.Id == p.ManufacturerId && p.Active == 1
select new 
    { 
        p.Name,
        p.CatalogId,
        p.ManufacturerId,
        c.Name,
        m.Name 
    };
于 2018-04-07T07:45:01.453 回答