J'ai un entityDao qui est hérité par tout le monde de mes objectDaos. J'utilise Dynamic Linq et essaye de faire fonctionner certaines requêtes génériques.Aide Linq dynamique, différentes erreurs selon l'objet passé en paramètre?
Je le code suivant dans ma méthode générique dans mon 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;
}
Alors je l'appel de méthode suivante dans un test unitaire (tous mes objectDaos hériter entityDao):
[Test]
public void getOneByValueOfProperty()
{
Accomplishment result = accomplishmentDao.getOneByValueOfProperty
("AccomplishmentType.Name", "Publication");
Assert.IsNotNull(result);
}
Les passes ci-dessus (AccomplishmentType a une relation à l'accomplissement)
Accomplishment result = accomplishmentDao.getOneByValueOfProperty("Description", "Can you hear me now?");
Accomplishment result = accomplishmentDao.getOneByValueOfProperty("LocalId", 4);
Les deux travaux ci-dessus. Cependant,
Accomplishment result = accomplishmentDao.getOneByValueOfProperty
("Id", New Guid("95457751-97d9-44b5-8f80-59fc2d170a4c"));
ne fonctionne pas et dit le texte suivant:
Operator '=' incompatible with operand types 'Guid' and 'Guid
Pourquoi est-ce qui se passe? Guid ne peut pas être comparé? J'ai aussi essayé ==
mais la même erreur. Ce qui est encore moreso confusion est que chaque exemple de dynamique LINQ je l'ai vu usings simplement des chaînes si l'utilisation du paramétrés où prédicat ou celui-ci je l'ai commenté sur:
//.Where(getProperty & "==" & CStr(getValue))
Avec ou sans le CSTR, de nombreux types de données ne fonctionnent pas avec ce format. J'ai essayé de définir getValue sur une chaîne à la place d'un objet, mais j'ai juste des erreurs différentes (par exemple, une chaîne multiword arrêterait la comparaison après le premier mot).
Qu'est-ce qui me manque pour que cela fonctionne avec les GUID et/ou tout type de données? Idéalement je voudrais pouvoir passer une chaîne pour getValue (comme je l'ai vu pour tous les autres exemples LINQ dynamiques) au lieu de l'objet et le faire fonctionner indépendamment du type de données de la colonne.