J'ai passé les 6 derniers mois, le combat contre cette limitation avec EF 3.5 et alors que je ne suis pas la personne la plus intelligente dans le monde entier, je suis sûr que j'ai quelque chose d'utile à offrir sur ce sujet.
Le SQL généré par la croissance de 50 mile de haut arbre de la "OU le style" expressions permettront de merde plan d'exécution de requête. Je fais face à quelques millions de lignes et l'impact est considérable.
Il y a un peu de bidouille, j'ai trouvé pour faire un SQL 'dans', qui aide si vous êtes simplement à la recherche d'un groupe d'entités par id:
private IEnumerable<Entity1> getByIds(IEnumerable<int> ids)
{
string idList = string.Join(",", ids.ToList().ConvertAll<string>(id => id.ToString()).ToArray());
return dbContext.Entity1.Where("it.pkIDColumn IN {" + idList + "}");
}
où pkIDColumn est votre id de clé primaire nom de la colonne de votre l'entité1 table.
MAIS CONTINUEZ À LIRE!
C'est bien, mais cela nécessite que j'ai déjà eu l'id de ce que j'ai besoin de trouver. Parfois, je veux juste mes expressions à atteindre dans d'autres relations et de ce que j'ai, est des critères pour celles qui sont liées relations.
Si j'avais plus de temps, je voudrais essayer de représenter visuellement, mais je n'ai pas seulement d'étudier cette phrase un moment: Considérons un schéma avec une Personne, GovernmentId, et GovernmentIdType tables. Andrew Tappert (Personne) a deux cartes d'identité (GovernmentId), l'un de l'Oregon (GovernmentIdType) et l'autre de Washington (GovernmentIdType).
Maintenant générer un edmx.
Maintenant, imaginez que vous voulez trouver toutes les personnes qui ont une certaine valeur de l'ID, dire 1234567.
Ceci peut être accompli avec une base de données unique frappé avec cela:
dbContext context = new dbContext();
string idValue = "1234567";
Expression<Func<Person,bool>> expr =
person => person.GovernmentID.Any(gid => gid.gi_value.Contains(idValue));
IEnumerable<Person> people = context.Person.AsQueryable().Where(expr);
Voyez-vous la sous-requête ici? Le sql généré utilisera 'rejoint' au lieu de sous-requêtes, mais l'effet est le même. Ces journées SQL server optimise les sous-requêtes dans les jointures sous les couvertures, de toute façon, mais de toute façon...
La clé de ce travail est la .Tout l'intérieur de l'expression.