Linq. Choisir parmi plusieurs tables

Dans le projet j’ai ces tables:

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

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

Comment écrire dans Linq cette requête SQL ci-dessous si je souhaite obtenir un 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 

Tout d’abord, je vais répondre à votre question .. puis adresser 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 object anonyme avec les articles que vous avez demandés. Si vous avez besoin de l’utiliser ailleurs (et que vous n’utilisez pas d’objects dynamics), je vous suggérerais 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 ssortingng Name { get; set; } public int CatalogId { get; set; } public int ManufacturerId { get; set; } public ssortingng CatalogName { get; set; } public ssortingng 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 un peu moins pénible le référencement des résultats de votre requête.

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 de fabricant existante

Si les numéros 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 éventuellement le charger en profondeur pour inclure les informations du fabricant / catalogue, ou utiliser le modèle d’affichage mentionné ci-dessus.

Bonne chance!

Pour combiner les résultats de plusieurs tables sans jointure explicite:

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