web-dev-qa-db-fra.com

Linq. Sélectionnez parmi plusieurs tableaux

Dans le projet, j'ai ces tableaux:

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

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

Comment peut-on écrire dans Linq cette requête SQL ci-dessous si je veux obtenir un article de 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
15

Tout d'abord, je répondrai à votre question .. puis adresserez votre réponse aux commentaires. Pour répondre à votre question, dans Linq vous feriez ce qui 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és. Si vous devez 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 de 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 rendra le référencement des résultats de votre requête un peu moins pénible.

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

  1. Le drapeau actif de votre produit est 1
  2. Votre produit a une entrée de catalogue existante
  3. Votre produit a une entrée Fabricant existante

Si # 2 et # 3 sont superflus et que 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 potentiellement le charger en profondeur pour inclure des informations sur le fabricant/catalogue ou utiliser le modèle de vue susmentionné.

Bonne chance!

45
Jaime Torres

Pour combiner les résultats de plusieurs tables sans jointures explicites:

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