Exécute une expression d'arbre linq dans un emplacement

c# entity-framework expression-trees linq

Question

Voici mon scénario: Je dois extraire les données d'une entité à l'aide d'une requête "OU" sur une propriété d'une entité liée.

Ce sont mes entités:

public class Dealer
{
  public virtual int id{get;set;}
  public virtual string name{get;set;}
  public virtual IList<Car> Cars{get;set;}
}

public class Car 
{
  public virtual int id{get;set;}
  public virtual string name{get;set;}
  public virtual int kw{get;set;}
}

Exemple: je veux extraire tous les concessionnaires qui ont des voitures avec 98kw ou 100kw. Exemple SQL:

public class Dealer
{
  public virtual int id{get;set;}
  public virtual string name{get;set;}
  public virtual IList<Car> Cars{get;set;}
}

public class Car 
{
  public virtual int id{get;set;}
  public virtual string name{get;set;}
  public virtual int kw{get;set;}
}

J'ai essayé d'utiliser les arbres d'expression mais je ne sais pas comment les utiliser. J'ai essayé ceci:

public class Dealer
{
  public virtual int id{get;set;}
  public virtual string name{get;set;}
  public virtual IList<Car> Cars{get;set;}
}

public class Car 
{
  public virtual int id{get;set;}
  public virtual string name{get;set;}
  public virtual int kw{get;set;}
}

mais j'obtiens ces erreurs de compilation sur la dernière ligne où j'essaie d'exécuter l'expression:

  • Impossible de convertir l'expression lambda en string type car ce n'est pas un type de délégué
  • System.Collections.Generic.IList<Cars> ne contient pas de définition pour Any et la meilleure méthode d'extension surcharge System.Linq.Enumerable.Any (System.Collections.Generic.IEnumerable, System.Func) contient des arguments non valides.
  • Argument 2: impossible de convertir System.Linq.Expressions.Expression<System.Func<Cars,bool>> en System.Func<Cars,bool>

Aucune suggestion?

Réponse populaire

selon le commentaire que j'ai laissé:

... puis-je faire une petite suggestion qui peut être ou ne pas être accueilli avec joie. à mon avis, vous devriez éviter d'utiliser les expressions RAW de cette manière dans un environnement ouvert. Je recommanderais vivement que vous adoptiez une approche plus fermée et que vous regardiez quelque chose comme le prédicatbuilder albahari : albahari.com/nutshell/predicatebuilder.aspx vous épargnera beaucoup de frustration. quelques bons exemples de travail sur la page aussi

Je ne saurais trop insister sur les avantages que cela a donné à de nombreux projets que nous avons entrepris. L'utilisation de cette bibliothèque / approche se traduit par des expressions du type:

IQueryable<Product> SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.False<Product>();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);
}

etc. Ainsi, vous pouvez construire des déclarations assez complexes qui masqueront tous les éléments internes. Cela est tout à fait logique, surtout si des développeurs plus jeunes travaillent sur le code maintenant ou dans le futur. Je vous exhorte vivement à vous laisser aller à votre curiosité et à vous diriger vers le lien pour en obtenir un meilleur aperçu.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi