2012-09-09 14 views
12

W projekcie mam to tabele:Linq. Wybierz jedną z wielu tabel

  1. produktu (id, catalogId, manufacturerId ...)
  2. Katalog
  3. Producent

także Product modelu (id, name, catalogId, catalogTitle, manufacturerId, manufacturerName).

Jak napisać w Linq to zapytanie SQL poniżej, jeśli chcę uzyskać pozycję produktu?

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

co się stało z dołączeniem? http://www.dotnetperls.com/join – TigOldBitties

+0

@TigOldBitties Ostatnio edytowałem moje pytanie. Chcę uzyskać pozycję produktu. –

+0

Pytanie nadal obowiązuje bez względu na to, co próbujesz zdobyć. – TigOldBitties

Odpowiedz

40

Najpierw odpowiem na twoje pytanie .. następnie zająć swoją odpowiedź na komentarze. Aby odpowiedzieć na twoje pytanie, w Linq zrobiłbyś:

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

To da ci anonimowy przedmiot z żądanymi przedmiotami. Jeśli chcesz użyć tego gdzie indziej (i nie korzystasz z obiektów dynamicznych), proponuję utworzyć model widoku i utworzyć instancję jednego z tych w twoim wyborze.

Przykład:

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

To sprawi przedstawieniu zapytanie powoduje trochę mniej bolesne.

Aby odpowiedzieć na Twój komentarz, robisz wiele złączeń, jeśli chcesz tylko tego produktu. Twoje kryteria zapewnią tylko trzy rzeczy

  1. Aktywny flag Twój produkt jest 1
  2. Twój produkt ma istniejący wpis katalogowy
  3. produkt ma istniejącego wpisu producent

Jeśli # 2 i # 3 są zbędne i niekoniecznie potrzebujesz nazw, możesz po prostu:

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

Jeśli Produkt jest modelem CRUD, możesz go głęboko wczytać, dodając informacje o producencie/katalogu lub użyć wspomnianego modelu widoku.

Powodzenia!