2011-04-08 3 views
2

J'ai une méthode pour la recherche qui ressemble à ceci:requête LINQ par Contient et Nullable Valeur

public IEnumerable<Result> Search(string searchText) 
{ 

    return _context.Person.Where(x => x.Contains(searchText)); 
} 

Je veux être en mesure d'appeler cette fonction avec searchText étant nul/vide et obtenir tous les enregistrements de retour .

J'ai essayé sans succès:

return _context.Person.Where(x => x.Contains(searchText ?? "")); 

est-il une autre façon d'y parvenir en plus le casser en deux étapes et la vérification searchString dans une instruction if avant de l'appliquer à la requête?

+0

connexes (mais pas votre problème spécifique ici): http://stackoverflow.com/questions/682429/how-can-i-query-for-null-values-in-entity-framework –

+0

Est 'Contient 'un méthode de votre classe 'Person'? Qui recherche FirstName et LastName et ainsi de suite? Comment avez-vous obtenu la version originale '_context.Person.Where (x => x.Contains (searchText))' fonctionnant avec LINQ to Entities? Pouvez-vous montrer cette méthode? – Slauma

+0

@Sla http://weblogs.asp.net/zeeshanhirani/archive/2008/04/18/how-to-do-in-and-like-clause-in-linq-to-sql.aspx – stephen776

Répondre

4
public IEnumerable<Result> Search(string searchText) 
{ 
    if(string.IsNullOrEmpty(searchText)) 
     return _context.Person; 
    else 
     return _context.Person.Where(x => x.Contains(searchText)); 
} 
0
return _context.Person.Where(x =>string.IsNullOrEmpty(searchText) ? true : x.Contains(searchText)); 

ou

public IEnumerable<Result> Search(string searchText) 
    { 
     return string.IsNullOrEmpty(searchText) ? _context.Person : _context.Person.Where(x => x.Contains(searchText)); 
    } 
4
_context.Person.Where(x => string.IsNullOrEmpty(searchText) ? true : x.Contains(searchText)); 
+0

Nice et le chemin le plus court. Merci. – Dilip0165

0

Vous pouvez le faire comme ceci:

return _context.Person.Where(x => 
    string.IsNullOrEmpty(searchText) || 
    x.Contains(searchText) 
); 

Ceci est un modèle que j'utilise beaucoup quand j'ai les paramètres que je veux appliquer seulement s'ils sont définis.

0

Et d'une manière moins efficace ... Je ne sais pas si cela est sémantiquement correct, mais vous voyez l'idée ...

return _context.Person.Where((x, index) => x.Contains(searchText ?? x[index])); 
0

En supposant que Person est une classe Contains semble être la méthode de cette classe. Une expression comme Where(x => x.Contains(searchText)) ou Where(x => string.IsNullOrEmpty(searchText) || x.Contains(searchText)) où x est une personne ne fonctionne pas du tout avec LINQ to Entities, même avec une classe simple comme ...

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public bool Contains(string searchText) 
    { 
     return Name.Contains(searchText); 
    } 
} 

... il lancera une exception parce que LINQ to Entities ne peut pas traduire cette méthode en une expression de stockage. Where(x => string.IsNullOrEmpty(searchText) || x.Name.Contains(searchText)) fonctionnerait bien.