2009-12-04 3 views
0

J'utilise Ria Service domainservice pour la requête de données.Linq Containsfunction problem

Dans ma base de données, il ya un tableau People avec le prénom, le nom. Ensuite, j'utilise les services EF/RIA pour le traitement des données.

Ensuite, je crée un filtre ViewModel pour capturer les entrées utilisateur, en fonction de l'entrée, je construis une requête linq pour accéder aux données.

A côté serveur, la valeur par défaut DomainService requête pour personne est:

public IQueryable<Person> GetPerson() 
    { 
    return this.Context.Person; 
    } 

A côté client, la requête LINQ pour le filtre est quelque chose comme (je l'utilise contient la fonction ici):

if (!String.IsNullOrEmpty(this.LastName)) 
    q = q.Where(p => (p.LastName.Contains(this.LastName))); 

La requête linq générée est quelque chose comme (lors du débogage, je l'ai eu):

MyData.Person[].Where(p => (p.LastName.Contains(value(MyViewModel.PersonFilterVM).LastName) || p.Person.LegalLastName.Contains(value(MyViewModel.PersonFilterVM).LastName))) 

Lorsque je cours t L'application, j'ai mis "Smith" pour le nom de famille pour la recherche, mais le résultat est totalement hors de propos avec "Smith"!

Comment le réparer?

Répondre

1

Je devine ici quelle est votre erreur, donc cela pourrait ne pas fonctionner pour vous.

Dans votre deuxième extrait de code, procédez comme suit.

q = q.Where(p => (p.LastName.Contains(this.LastName))); 

C'est là que je pense que votre erreur est. Linq n'évalue pas la clause where tant que vous ne l'avez pas itérée. Essayez de changer la ligne à la suivante.

qWithData = q.Where(p => (p.LastName.Contains(this.LastName))).ToList(); 

L'appel .ToList() chargera la requête avec des données.

0

Lorsque vous archivez le débogueur, value(MyViewModel.PersonFilterVM).LastName évalue-t-il à Smith au moment où la requête est résolue? Rappelons que les requêtes ne sont pas résolues tant qu'elles ne sont pas énumérées.