0

Je reçois cette erreur:Comment puis-je écrire une comparaison personnalisée (définition de l'opérateur binaire Equal) pour l'objet entityframework dans un int?

ex = {"The binary operator Equal is not defined for the types 'MySite.Domain.DomainModel.EntityFramework.NickName' and 'System.Int32'."}

Ce que j'ai essayé de faire était de faire tout sélectionner où le NickNameId = someIntPassedIn ... le problème est que la NickNameId est une clé étrangère, alors quand il compare le someIntPassedIn à le NickNameId il tire l'objet entier NickName que le NickNameId fait référence et essaye de comparer l'int à cet objet.

Je besoin d'une solution ici pour lui permettre de comparer l'int Id de l'objet nickname ... si

A) Comment puis-je définir l'opérateur binaire égal pour comparer ces deux objets

OU

B) Comment puis-je le comparer directement à l'ID au lieu de l'objet entier?

Vous ne devez pas lire cela, mais voici la méthode SelectAllByKey Incase il aide:
(je suis passé « NickNameId » et « 1 »)

public IList<E> SelectAllByKey(string columnName, string key) 
    { 
     KeyProperty = columnName; 
     int id; 
     Expression rightExpr = null; 

     if (int.TryParse(key, out id)) 
     { 
      rightExpr = Expression.Constant(id); 
     } 
     else 
     { 
      rightExpr = Expression.Constant(key); 
     } 

     // First we define the parameter that we are going to use the clause. 
     var xParam = Expression.Parameter(typeof(E), typeof(E).Name); 
     MemberExpression leftExpr = MemberExpression.Property(xParam, this._KeyProperty); 
     int temp; 
     BinaryExpression binaryExpr = MemberExpression.Equal(leftExpr, rightExpr); 
     //Create Lambda Expression for the selection 
     Expression<Func<E, bool>> lambdaExpr = Expression.Lambda<Func<E, bool>>(binaryExpr, new ParameterExpression[] { xParam }); 
     //Searching .... 
     IList<E> resultCollection = ((IRepository<E, C>)this).SelectAll(new Specification<E>(lambdaExpr)); 
     if (null != resultCollection && resultCollection.Count() > 0) 
     { 
      //return valid single result 
      return resultCollection; 
     }//end if 
     return null; 
    } 

Laissez-moi savoir si vous avez besoin de plus Info.

Merci,
Matt

Répondre

2

Vous devriez appeler SelectAllByKey('NickName.ID','1').

Depuis ID est la propriété de la propriété, vous pouvez utiliser cette méthode d'extension:

public static MemberExpression PropertyOfProperty(this Expression expr,string propertyName) 
{   
    var properties = propertyName.Split('.'); 

    MemberExpression expression = null; 

    foreach (var property in properties) 
    { 
     if (expression == null) 
      expression = Expression.Property(expr, property); 
     else 
      expression = Expression.Property(expression, property); 
    } 

    return expression; 
} 
+0

Vous êtes un Dieu! Merci beaucoup! – Matt

2

La réponse acceptée semble façon trop compliqué pour le problème à portée de main, si je lis cela correctement.

Si je vous comprends bien, vous essayez d'exécuter une requête comme:

var q = from e in Context.SomeEntities 
     where e.NickNameId == someIntPassedIn 
     select e; 

... mais cela ne fonctionnera pas, parce que e.NickNameId est une entité, pas un entier.

Pour faire référence à la propriété Id, vous pouvez simplement s'y référer, comme ceci:

var q = from e in Context.SomeEntities 
     where e.NickNameId.Id == someIntPassedIn 
     select e; 

Mise à jour: Si vous ne pouvez pas utiliser les propriétés fortement typé en raison de votre niveau d'abstraction (par votre commentaire), puis utilisez query builder methods:

var q = (ObjectQuery<T>)Repository.SelectSomething(); 
return q.Where("it.NickName.Id = " + someIntPassedIn.ToString()); 

vous pouvez adapter cela comme bon vous semble, mais le point de vue général est que l'EF sait déjà comment traduire les chaînes aux membres de la propriété.

+0

C'est exact, sauf comment dois-je savoir quand c'est une entité (quand je suis censé utiliser le 2ème que vous avez fourni) et quand ce n'est pas? Le truc, c'est que j'utilise un dépôt générique, donc tout est trop compliqué ... De toute façon, sa solution a fonctionné, juste plug and play, donc je ne peux pas me plaindre. – Matt

+0

Voir mise à jour pour l'utilisation de chaînes à la place des références typées. Je ne dis pas que vous ne devriez pas être heureux que vous ayez quelque chose qui fonctionne; seulement que c'est trivial à faire dans l'EF. –

Questions connexes