2010-04-08 12 views
5

Tengo una entityDao que es heredada por todos mis objectDaos. Estoy usando Dynamic Linq y estoy tratando de hacer que algunas consultas genéricas funcionen.¿Ayuda de Dynamic Linq, diferentes errores dependiendo del objeto pasado como parámetro?

he el código siguiente en mi método genérico en mi 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; 
} 

Entonces me la siguiente llamada a un método en una unidad de prueba (todos mis objectDaos heredar entityDao):

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

    Assert.IsNotNull(result); 
} 

Los pases anteriores (AccomplishmentType tiene una relación con el logro)

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

Ambos trabajos anteriores. Sin embargo,

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

no funciona y dice lo siguiente:

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

Por qué sucede esto? Guid no se puede comparar? Intenté == también pero el mismo error. Lo que es más aún confuso es que cada ejemplo de dinámica LINQ he visto simplemente usings cadenas si el uso de la parametrizada donde predicado o éste he comentado a cabo:

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

Con o sin el Cstr, muchos tipos de datos no funcionan con este formato. Intenté configurar getValue en una cadena en lugar de en un objeto, pero luego recibí diferentes errores (como una secuencia de varias palabras que detenía la comparación después de la primera palabra).

¿Qué me hace falta para que esto funcione con GUID y/o cualquier tipo de datos? Idealmente, me gustaría poder pasar una cadena para getValue (como he visto para cada otro ejemplo de LINQ dinámico) en lugar del objeto y hacer que funcione independientemente del tipo de datos de la columna.

Respuesta

6

Welp Me di cuenta de esto, Dynamic LINQ inicialmente no es compatible con la comparación de GUID (tan estúpido!). Me pareció que esta pequeña golosina: https://connect.microsoft.com/VisualStudio/feedback/details/333262/system-linq-dynamic-throws-an-error-when-using-guid-equality-in-where-clause

Usted sólo tiene que ir en una edición Dynamics.cs, reemplazar la interfaz IEqualitySignatures con lo siguiente:

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); 
} 

Ahora mi getOneByValueOfProperty trabaja todo el tiempo!

0

para Guid esto debería funcionar:

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

(Nota El parámetro getValue debe ser de tipo Guid)

Cuestiones relacionadas