19

プロジェクトには、次のテーブルがあります。

  1. 製品 (ID、カタログ ID、製造元 ID...)
  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
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 };

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

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

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

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

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

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

幸運を!

于 2012-09-09T14:20:33.543 に答える