林克。从多个表中选择

Posted

技术标签:

【中文标题】林克。从多个表中选择【英文标题】:Linq. Select from multiple tables 【发布时间】:2012-09-02 14:44:27 【问题描述】:

在项目中我有这个表:

    产品(id、catalogId、manufacturerId...) 目录 制造商

还有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

【问题讨论】:

加入怎么了? dotnetperls.com/join @TigOldBitties 我最近编辑了我的问题。我想获得产品项目。 无论你想得到什么,这个问题仍然适用。 【参考方案1】:

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

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 
    ;

【讨论】:

【参考方案2】:

首先,我将回答您的问题..然后将您的答案提交给 cmets。要回答您的问题,在 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 您的产品有一个现有的目录条目 您的产品已有制造商条目

如果 #2 和 #3 是多余的并且您不一定需要名称,您可以这样做:

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

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

祝你好运!

【讨论】:

以上是关于林克。从多个表中选择的主要内容,如果未能解决你的问题,请参考以下文章

从多个表中选择多个列

Codeigniter:从多个表中选择

MySQL - 从多个表中选择并显示多个字段

从多个表中选择数据列表

从多个表中选择最大数量

从多个表中选择并显示到表中