Si j'ai un modèle qui ressemble à ceci: Lorsque quering sur un type de base pourquoi le fournisseur EF générer tous les UNION Toutes les clauses
et je fais une requête LINQ to entités comme ceci:
var c = MyContext.Contact.Count();
Je vais obtenir une requête SQL qui est aussi grande que toutes les portes!
SELECT
[GroupBy1].[A1] AS [C1]
FROM (SELECT
COUNT(1) AS [A1]
FROM [dbo].[Contacts] AS [Extent1]
LEFT OUTER JOIN (SELECT
[UnionAll1].[Id] AS [C1]
FROM (SELECT
[Extent2].[Id] AS [Id]
FROM [dbo].[Companies] AS [Extent2]
UNION ALL
SELECT
[Extent3].[Id] AS [Id]
FROM [dbo].[Employees] AS [Extent3]) AS [UnionAll1]
UNION ALL
SELECT
[Extent4].[Id] AS [Id]
FROM [dbo].[Contractors] AS [Extent4]) AS [UnionAll2] ON [Extent1].[Id] = [UnionAll2].[C1]
LEFT OUTER JOIN (SELECT
[UnionAll3].[Id] AS [C1]
FROM (SELECT
[Extent5].[Id] AS [Id]
FROM [dbo].[Suppliers] AS [Extent5]
UNION ALL
SELECT
[Extent6].[Id] AS [Id]
FROM [dbo].[Customers] AS [Extent6]) AS [UnionAll3]
UNION ALL
SELECT
[Extent7].[Id] AS [Id]
FROM [dbo].[People] AS [Extent7]) AS [UnionAll4] ON [Extent1].[Id] = [UnionAll4].[C1]
) AS [GroupBy1]
Il me semble que cela devrait être une simple requête qui exécute sur la table de type de base (contact dans ce cas) Le modèle que j'ai inclus ici est un échantillon édulcoré de ce que je suis travailler avec. Comme vous pouvez l'imaginer avec une hiérarchie de 6 niveaux au lieu de 3, les requêtes SQL sur tout autre chose que les types les plus dérivés sont très coûteuses.
Y at-il un moyen de tweek la requête, ou la définition du modèle pour réduire la complexité inutile de cette requête.
Vous n'êtes pas sûr des spécificités de ce code, mais vous pouvez consulter cet article. http://blogs.teamb.com/craigstuntz/2010/04/21/38598/ –
@John, Merci pour le lien. Dans mon cas, le comte() est ce que je ne veux pas tout, bien que le point soit bien pris. J'ajouterais howerver, que Any ou Count, le SQL qui en résulte est tout aussi utile. –