2010-04-08 3 views
5

Ho un'entità che viene ereditata da tutti i miei objectDaos. Sto usando Dynamic Linq e sto cercando di far funzionare alcune query generiche.Guida dinamica Linq, errori diversi a seconda dell'oggetto passato come parametro?

Ho il seguente codice nel mio metodo generico nel mio EntityDao:

public abstract class EntityDao<ImplementationType> where ImplementationType : Entity 
{ 
    public ImplementationType getOneByValueOfProperty(string getProperty, object getValue){ 
    ImplementationType entity = null; 
    if (getProperty != null && getValue != null) 
    { 
     LCFDataContext lcfdatacontext = new LCFDataContext(); 
     //Generic LINQ Query Here 
     entity = lcfdatacontext.GetTable<ImplementationType>().Where(getProperty + " [email protected]", getValue).FirstOrDefault(); 
     //.Where(getProperty & "==" & CStr(getValue)) 
    } 

//lcfdatacontext.SubmitChanges() 
//lcfdatacontext.Dispose() 

return entity; 
} 

Poi io metodo la seguente chiamata a una prova di unità (tutte le mie objectDaos ereditare entityDao):

[Test] 
public void getOneByValueOfProperty() 
{ 
    Accomplishment result = accomplishmentDao.getOneByValueOfProperty 
     ("AccomplishmentType.Name", "Publication"); 

    Assert.IsNotNull(result); 
} 

I passaggi precedenti (AccomplishmentType ha una relazione con la realizzazione)

Accomplishment result = accomplishmentDao.getOneByValueOfProperty("Description", "Can you hear me now?"); 
Accomplishment result = accomplishmentDao.getOneByValueOfProperty("LocalId", 4); 

Entrambi i lavori precedenti. Tuttavia,

Accomplishment result = accomplishmentDao.getOneByValueOfProperty 
    ("Id", New Guid("95457751-97d9-44b5-8f80-59fc2d170a4c")); 

non funziona e dice il seguente:

Operator '=' incompatible with operand types 'Guid' and 'Guid 

Perché succede questo? Le guide non possono essere paragonate? Ho provato anche == ma lo stesso errore. Che cosa è ancora dà fastidio solo confusione è che ogni esempio di dinamica LINQ ho visto usings semplicemente stringhe sia che si utilizzi la parametrizzato in cui predicato o questo ho commentato fuori:

//.Where(getProperty & "==" & CStr(getValue)) 

Con o senza Cstr, molti tipi di dati non funzionano con questo formato. Ho provato a impostare il valore getValue su una stringa anziché su un oggetto, ma poi ho ricevuto solo errori diversi (ad esempio una stringa multiword avrebbe fermato il confronto dopo la prima parola).

Cosa mi manca per farlo funzionare con GUID e/o qualsiasi tipo di dati? Idealmente mi piacerebbe essere in grado di passare una stringa per getValue (come ho visto per ogni altro esempio di LINQ dinamico) invece dell'oggetto e farlo funzionare indipendentemente dal tipo di dati della colonna.

risposta

6

Welp Ho capito, Dynamic LINQ inizialmente non supporta il confronto di GUID (così stupido!). Ho trovato questo piccolo bocconcino: https://connect.microsoft.com/VisualStudio/feedback/details/333262/system-linq-dynamic-throws-an-error-when-using-guid-equality-in-where-clause

Basta andare in una modifica Dynamics.cs, sostituire l'interfaccia IEqualitySignatures con il seguente:

interface IEqualitySignatures : IRelationalSignatures 
{ 
    void F(bool x, bool y); 
    void F(bool? x, bool? y); 
    void F(Guid x, Guid y); 
    void F(Guid? x, Guid? y); 
} 

Ora il mio getOneByValueOfProperty lavora tutto il tempo!

0

per Guid questo dovrebbe funzionare:

.Where(getProperty + ".Equals(@0)", getValue); 

(notare il parametro getValue dovrebbe essere di tipo Guid)

Problemi correlati