2013-05-23 6 views
6

Sto cercando di eseguire questo query per recuperare gli elementi di controllo per specifici tipi di entitàQuery LINQ CRM 2011 non valida: "Invalid 'where' condition. Un membro di entità sta invocando una proprietà o un metodo non valido."

public List<Audit> GetAuditChangesSince(DateTime since, string entityType) 
{ 
    return (from a in OrgContext.CreateQuery<Audit>() 
     where 
      a.ObjectId != null && a.ObjectId.LogicalName == entityType && 
      a.CreatedOn > since 
     select a).ToList(); 
} 

Il a.ObjectId! = Null & & a.ObjectId.LogicalName problemi == entityType & & clausola sta causando. So .Equals() può causare problemi (quindi ==) e ci sono queste limitazioni al provider LINQ:

Il lato sinistro della clausola deve essere un nome di attributo e il lato destro della clausola deve essere un valore

Il lato sinistro è una proprietà e il lato destro è una costante. .ObjectId.LogicalName è la causa del problema?

risposta

6

Perché l'ente di revisione non fornisce un Attributo di livello base per il nome logico/tipo di codice dell'entità a cui è correlato un particolare record, il meglio che puoi fare qui è di collegare all'entità (o alle entità) per cui vuoi individuare i record di controllo - cioè senza recuperare tutti i record.

Una tecnica generale per scenari come questo è che è possibile collegarsi a un'entità correlata con una condizione semi-assurda come controllare che la chiave primaria non sia nullo. Per il tuo caso, solo il link dovrebbe essere sufficiente.

Un esempio per tirare record di controllo legati a un contatto:

from a in OrgContext.CreateQuery<Audit>() 
join c in ContactSet on a.ObjectId.Id equals c.ContactId 
where a.ObjectId != null && a.CreatedOn > since 
select a 
+2

Grazie per la risposta. Potresti gentilmente spiegare cosa intendi per "attributo a livello del suolo"? Grazie. – Ryan

+2

Nessun problema! Volevo solo dire che, come hai suggerito nella tua domanda, dal momento che non esiste alcun attributo effettivo sull'entità di revisione per il nome logico/tipo di codice dell'entità a cui è collegato il record di revisione, non c'è modo di filtrare direttamente sull'entità di revisione . In termini di query sul CRM, dobbiamo pensare ai campi di tipo "EntityReference" come solo interrogabili dalle loro proprietà "Id". I metadati del tipo di record associato a quell'Id sono estratti da noi e non direttamente interrogabili in questa istanza. Fammi sapere se posso chiarire ulteriormente! – GotDibbs

+0

Capito. Molte grazie! – Ryan

1

Aggiungi un ToList() dopo che il metodo CreateQuery, in questo modo le vostre condizioni lavoreranno con LINQ to Objects fornitore e non con il provider di CRM LINQ (ei suoi limiti)

public List<Audit> GetAuditChangesSince(DateTime since, string entityType) 
{ 
    return (from a in OrgContext.CreateQuery<Audit>().ToList() 
     where 
      a.ObjectId != null && a.ObjectId.LogicalName == entityType && 
      a.CreatedOn > since 
     select a).ToList(); 
} 
+1

Would che causano l'OrgContext.CreateQuery () per valutare, quindi, tirando tutti i record di controllo dal server, prima di applicare il filtro? – Ryan

+0

Con alta probabilità è sì, è possibile dividere in due fasi, recuperando prima l'Audit con solo la condizione createdon e dopo aver valutato il tipo di entità. –

+1

@ Ryan sì, valuterà. – ccellar

Problemi correlati