Próbuję użyć LINQ do kwerendy na następujący model danych jednostki
w oparciu o ten model db
Chciałbym móc pobrać listę produktów opartych na ProductFacets.FacetTypeId.
Zwykle używam złączeń i nie byłoby to problemem, ale nie bardzo rozumiem, jak wysyłać zapytania do tabel wiele do wielu w ramach Entity DataModel.
To jest przykładowe zapytanie SQL:
select p.Name, pf.FacetTypeId from Products p
inner join ProductFacets pf on p.ProductId = pf.ProductId
where pf.FacetTypeId in(8, 12)
Odpowiedzi:
1 dla odpowiedzi № 1Zakładając EF 4:
var facetIds = new [] { 8, 12 };
var q = from p in Context.Products
where p.FacetTypes.Any(f => facetIds.Contains(f.FacetTypeId))
select p;
1 dla odpowiedzi nr 2
W EF (zakładając, że mapowanie odbywa się poprawnie), łączenia rzadko są używane; używane są właściwości nawigacji.
Twój oryginalny SQL zwraca krotkę z powtarzającymi się wpisami w nazwie. Dzięki LINQ jest to często łatwiejsze "kształtować" zapytania do wyników niezwiązanych z krotką.
Następujące powinny być takie same jak SQL, ale zamiast zwracać pary (Name, FacetTypeId) z powtarzającymi się nazwami, zwrócą typ, który ma nazwę i sekwencję FacetTypeIds:
var facetIds = new [] { 8, 12 };
var result = from p in db.Products
select new
{
p.Name,
FacetTypeIds = from pf in p.FacetTypes
where pf.FacetTypeId == 8 || pf.FacetTypeId == 12
select pf.FacetTypeId,
};