web-dev-qa-db-ja.com

Linq。複数のテーブルから選択

プロジェクトには次の表があります。

  1. 製品(id、catalogId、manufacturerId ...)
  2. カタログ
  3. メーカー

Productモデル(id, name, catalogId, catalogTitle, manufacturerId, manufacturerName)

製品アイテムを取得したい場合、このSQLクエリをLinqでどのように記述できますか?

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
15

最初に、あなたの質問に答えます。次に、コメントへの答えに取り組みます。質問に答えるには、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 };

これにより、リクエストしたアイテムを含む匿名オブジェクトが作成されます。これを他の場所で使用する必要がある場合(動的オブジェクトを使用していない場合)、ビューモデルを作成し、選択したモデルの1つをインスタンス化することをお勧めします。

例:

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 };

これにより、クエリ結果を参照するのが少し楽になります。

あなたのコメントに答えるために、あなたが望むのが製品だけであるなら、あなたは多くの参加をしています。あなたの基準は3つのことだけを保証します

  1. 製品の有効フラグは1です
  2. 製品には既存のカタログエントリがあります
  3. 製品に既存のメーカーエントリがあります

#2と#3が不要で、必ずしも名前が必要でない場合は、次のようにします。

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

製品がCRUDモデルである場合、潜在的にそれをディープロードしてメーカー/カタログ情報を含めるか、前述のビューモデルを使用できます。

幸運を!

45
Jaime Torres

明示的に結合せずに複数のテーブルの結果を結合するには:

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 
    };
5
Paul Nakitare