Ręcznie wybierz powiązane dane tabeli (SELECT N + 1 problem) LINQ to SQL
Przykład bazy danych:
Obraz - ImageTag - Tag
Obrazy mogą mieć wiele tagów. Relacje są dobrze skonfigurowane, ale mam problemy z wydajnością.
Mam wiele różnych zapytań, które wybierają obrazy według różnych kryteriów. Działają dobrze, jednak dane dla znaczników nie są wybierane w tych zapytaniach.
Oznacza to, że jeśli przeglądam listę 10 obrazów i próbuję uzyskać dostęp do ich obiektów znaczników (za pomocą ImageTag), to w mojej bazie danych wykonywane jest nowe zapytanie dla każdego obrazu.
<%foreach (LINQRepositories.Image i in Model)
{ %>
<li><%=i.title%>
<ul>
<%foreach(ImageTag t in i.ImageTags){ %>
<li><%=t.Tag.name%></li>
<%} %>
</ul>
</li>
<%} %>
To oczywiście nie jest idealne. Czy istnieje sposób zmuszenia LINQ do SQL do zapytania o określone dane?
Oto przykład jednego z moich zapytań
public static IQueryable<Image> WithTags(this IQueryable<Image> qry, IEnumerable<Tag> tags)
{
return
from i in qry
from iTags in i.ImageTags
where tags.Contains(iTags.Tag)
select i;
}
EdytowaćPo wypróbowaniu opcji pobierania danych jest to przykładowe zapytanie generowane
{SELECT [t0]. [Id], [t0]. [Tytuł], [t0]. [Legenda], [t0]. [DateAdded], [t0]. [Usunięte], [t0]. [AverageRating], [t0]. [numberOfVotes], [t0]. [imageOfTheWeek], [t0]. [copyright], [t0]. [copyrightText], [t0]. [areaOfInterest], [t0]. [typeId], [t0 ]. [authorId], [t0]. [editorialStatusId], [t0]. [komentarze] FROM [dbo]. [Image] AS [t0] CROSS JOIN ([dbo]. [ImageTag] AS [t1] INNER JOIN [ dbo]. [Tag] AS [t2] ON [t2]. [id] = [t1]. [TagId]) WHERE ([t2]. [id] = @ p0) AND (NOT ([t0]. [usunięte ] = 1)) AND (NOT ([t0]. [Usunięte] = 1)) AND ([t1]. [ImageId] = [t0]. [Id])}