2012-03-07 3 views
2

Je crois que la réponse à cette question peut être d'utiliser LINQ pour Sql, mais voulait voir si cela est quelque chose qui est possible en utilisant QueryExpressions: -CRM 2011: Limitation de l'expression de requête?

Je crée une expression de requête qui interroge contre l'entité A, elle a aussi des liens à l'entité B (via LinkEntity) et impose des critères supplémentaires. Il est possible d'extraire des colonnes de l'entité B en ajoutant les noms d'attribut appropriés. Cependant, il récupérera uniquement l'entité liée (jointure interne).

Est-il possible d'utiliser QueryExpression pour extraire tous les enregistrements associés (et les colonnes requises) de l'entité B associée à l'entité A (par exemple tous les cas associés à un contact dont le contact satisfait les critères spécifiés). Normalement, je considérerais d'inverser la requête et de chercher l'entité B relative à l'entité A avec les conditions LinkEntity appropriées, mais il y a un certain nombre d'entités liées que je voudrais récupérer pour la même requête de contact.

Je me reste quelques options: -

(1) Effectuer une deuxième requête (pas idéale lorsque vous parcourez un grand nombre de résultats de la requête initiale), (2) Effectuer une requête en utilisant Linq à CRM sur les vues filtrées, (3) Une méthode différente entièrement?

Toutes les pensées seraient appréciées.

EDIT:

Je fini par utiliser LINQ to Sql pour accomplir cette tâche et le code utilisé est similaire à celui ci-dessous (mais avec un peu plus rejoint pour la requête réelle!): -

var dataCollection = (from eA in xrmServiceContext.EntityASet 

join eB in xrmServiceContext.EntityBSet on new EntityReference(EntityA.EntityLogicalName, eA.Id) equals (EntityReference)eB.EntityBLookupToEntityA 
select new 
{ 
    Id = eA.Id, 
    EntityBInterestingAttribute = eB.InterestingAttributeName 
} 

donc, cela ramènera une ligne par l'entité a, par entité B. pour faciliter les choses, je puis défini une classe personnalisée « MyEntityAClass » qui avait des propriétés qui étaient des listes pour que je puisse retourner un objet pour le remplissage de GridView etc. Ceci est plus à faire avec le traitement de ces résultats si je n'ai pas posté ce code ici.

J'espère que cela a du sens. Essentiellement, il obtient les lignes multiples par enregistrement un SQL qui fait fonctionner cette méthode.

+0

Je suis sûr que juste moi, mais je ne comprends pas ce que vous QUERY essayez de faire? Pouvez-vous faire la requête que vous voulez en SQL? Les jointures externes gauches sont supportées par QueryExpression, ce qui pourrait être ce dont vous avez besoin? – BenPatterson1

+0

Bonjour Ben, merci pour votre commentaire. Je suis capable d'effectuer la requête en SQL en utilisant des jointures internes et je récupère le nombre attendu de lignes, par ex. en sélectionnant Entity A set et en joignant à Entity B sur l'attribut lookup.Mais avec l'expression de requête si je tente de récupérer des colonnes de l'entité BI, je ne peux récupérer que des colonnes de l'un des N enregistrements correspondants dans l'entité B. Le problème ne réside donc pas tant dans la liaison, mais dans la récupération attributs requis des enregistrements liés lorsqu'il existe plusieurs d'entre eux (même alias d'entité et nom d'attribut). –

+0

Si ce n'est pas encore clair (je peux comprendre si ce n'est pas :) :) Je posterai un scénario de code quand je serai de retour sur mon autre machine plus tard. –

Répondre

-1

QueryExpression ne peut renvoyer que des champs d'un type d'entité, celui spécifié dans QueryExpression.EntityName.

Vous pouvez utiliser FetchXML qui vous permet également d'obtenir les champs de toutes les entités de liens, ce qui serait une option 3 pour vous, malheureusement, il retourne les données en XML que vous auriez alors à analyser.

Il est peut-être plus rapide d'exécuter FetchXML, mais il faudra du temps pour écrire et tester, et ce n'est pas la chose la plus facile à gérer.

Exemple de code, cela devient la première 101 de tous les cas qui sont actifs pour tous les comptes qui sont actifs

string fetch = "<fetch count='101' mapping='logical'><entity name='account'><filter type='and'><condition attribute='statecode' operator='eq' value='1'/></filter><link-entity name='incident' from='customerid' to='accountid'><all-attributes/><filter type='and'><condition attribute='statecode' operator='eq' value='1'/></filter></link-entity></entity></fetch>"; 

string data = yourCrmServiceObject.Fetch(fetch); 
+0

* "QueryExpression ne peut renvoyer que des champs d'un type d'entité, celui spécifié dans QueryExpression.EntityName." * Ceci est tout à fait faux. Vous pouvez avoir LinkEntity et ses attributs dans une QueryExpression exactement comme dans FetchXml. – Filburt