2010-03-03 4 views
1

J'essaie de modifier un code source ouvert pour changer la façon dont il filtre les résultats de recherche. Je veux interroger par le 'nom' d'un enregistrement au lieu de sa clé. (Je les dossiers avec des noms en double, je veux retirer, mais des clés différentes.)Sous-requêtes Linq

Ce retire tous les enregistrements

public static IEnumerable<ticket> GetTickets(stDataContext db, bool? active) 
    { 
     return from p in db.tickets 
       where 
        (active == null ? true : 
        ((bool)active ? p.active : !p.active)) 
       select p; 
    } 

Le niveau suivant dans les requêtes de code contre ce retour par la clé d'identification . Je ne suis pas sûr de l'endroit que je devrais modifier.

public static IEnumerable<ticket> Search(stDataContext db, string[] keywords, int usr, DateTime dtFrom, DateTime dtTo, int prty, int stat, bool onlyOpen, int grp, int subgrp,string subgroupName, bool? active) 
    { 
     return from p in GetTickets(db, active) 
       where 
        p.title.ToLower().Contains(keywords[0].ToLower()) && 
        p.title.ToLower().Contains(keywords[1].ToLower()) && 
        p.title.ToLower().Contains(keywords[2].ToLower()) && 
        p.title.ToLower().Contains(keywords[3].ToLower()) && 
        p.title.ToLower().Contains(keywords[4].ToLower()) && 
        p.title.ToLower().Contains(keywords[5].ToLower()) && 
        p.title.ToLower().Contains(keywords[6].ToLower()) && 
        p.title.ToLower().Contains(keywords[7].ToLower()) && 
        p.title.ToLower().Contains(keywords[8].ToLower()) && 
        p.title.ToLower().Contains(keywords[9].ToLower()) && 

        p.submitter == (usr < 0 ? p.submitter : usr) && 
        p.submitted >= dtFrom && 
        p.submitted <= dtTo && 
        (prty == 0 ? true : p.priority == prty) && 
        (stat == 0 ? true : p.ticket_status == stat) && 
        (!onlyOpen ? true : p.ticket_status != 5) && 
        (grp == 0 ? true : (
        (p.sub_unit2.unit_ref == grp) || 
        (p.sub_unit.unit_ref == grp))) && 
        (subgrp == 0 ? true : (
        (p.originating_group == subgrp) || 
        (p.assigned_to_group == subgrp))) 
       select p; 
    } 

Les 2 dernières lignes de la cause where sont celles que je veux changer. Au lieu d'utiliser la touche f (p.originating_group, p.assigned_to_group et subgrp), je souhaite utiliser le nom subgroupName.

Dois-je filtrer les enregistrements par le sous-groupe dans la méthode GetTickets ou par la méthode de recherche et comment ajouter une sous-requête au linq?

Merci, Tim

Répondre

1

au lieu de retourner directement les résultats là-bas, stocker la requête dans une variable

var query = from p in GetTickets(db, active) 
       where... 

vous pouvez appliquer d'autres critères à cette requête

return from c in query 
     where...//aply additional criteria here