2012-09-09 7 views
12

Dans projet, j'ai cette table:Linq. Choisissez parmi plusieurs tables

  1. Produit (id, catalogId, manufacturerId ...)
  2. Catalogue
  3. Fabricant

également Product modèle (id, name, catalogId, catalogTitle, manufacturerId, manufacturerName).

Comment écrire dans Linq cette requête SQL ci-dessous si je veux obtenir l'article du produit?

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 
+1

Qu'est-il arrivé à rejoindre? http://www.dotnetperls.com/join – TigOldBitties

+0

@TigOldBitties J'ai récemment modifié ma question. Je veux obtenir l'article de produit. –

+0

La question s'applique toujours, peu importe ce que vous essayez d'obtenir. – TigOldBitties

Répondre

40

D'abord, je vais répondre à votre question .. puis adressez votre réponse aux commentaires. Pour répondre à votre question, Linq vous procédez comme suit:

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

Cela vous donnera un objet anonyme avec les éléments que vous avez demandé. Si vous avez besoin de l'utiliser ailleurs (et que vous n'utilisez pas d'objets dynamiques), je vous suggère de créer un modèle de vue et d'instancier l'un de ceux-ci dans votre sélection.

Exemple:

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

Cela fera référence à votre requête entraîne un peu moins douloureux.

Pour répondre à votre commentaire, vous faites beaucoup de jointures si tout ce que vous voulez est le produit. Vos critères s'assurera seulement trois choses

  1. Votre drapeau actif de produit est 1
  2. Votre produit a une entrée de catalogue existant
  3. Votre produit a une entrée du fabricant existant

Si # 2 et # 3 sont superflus et vous n'avez pas nécessairement besoin des noms, vous pouvez simplement faire:

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

Si le produit est un modèle CRUD, vous pouvez éventuellement le charger en profondeur pour inclure des informations sur le fabricant/le catalogue ou utiliser le modèle de vue susmentionné.

Bonne chance!

Questions connexes