2011-02-23 2 views
4

J'utilise LinqKit PredicateBuilder (http://www.albahari.com/nutshell/predicatebuilder.aspx) pour une méthode de recherche. Voici comment les relations sont construites (Entity Framework 4 CPT 5 POCO):LinqKit PredicateBuilder avec EF 4 CPT 5 relations de table?

public class MusicSheet 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Key { get; set; } 

    public virtual ICollection<Author> Authors { get; set; } 
} 

public class Author 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Bio { get; set; } 

    public virtual ICollection<MusicSheet> MusicSheets { get; set; } 
} 

Je dois être en mesure de construire un prédicat qui vérifie MusicSheet (le Title contient un terme de recherche spécifique), ainsi que le Name ou Bio de l'auteur qui pourrait également contenir ce terme de recherche. Voici ce que j'ai actuellement:

var predicate = PredicateBuilder.False<MusicSheet>(); 
foreach (var term in terms) 
{ 
    string keyword = term; 

    predicate = predicate 
    .Or(s => s.Title.Contains(keyword)); 
    // TODO Check for Author Name & Bio 
} 

Des suggestions? Merci beaucoup.

Répondre

1

Avez-vous essayé ceci:

var predicate = PredicateBuilder.False<MusicSheet>(); 
foreach (var term in terms) 
{ 
    string keyword = term; 

    predicate = predicate 
     .Or(s => s.Title.Contains(keyword) || 
       s.Authors.Any (a => a.Name.Contains(keyword) || a.Bio.Contains(keyword))); 
} 
+0

Salut Joe, je vous remercie beaucoup pour votre aide. J'ai une question sur l'utilisation de la méthode "Ou". Dois-je le faire de la façon que vous avez montré ci-dessus, ou quelque chose comme ceci: 'predicate = predicate.Or (s => s.Title.Contains (mot-clé)) Ou (s => s.Authors.Any (a => a .Name.Contains (mot-clé))) ... ... 'Ou ils sont effectivement les mêmes (en utilisant plusieurs' Or' vs '||')? Merci encore. – Saxman

+0

J'utiliserais le || opérateur quand vous le pouvez: l'arbre d'expression résultant sera plus simple. –