2009-12-10 4 views
1

Supposons que j'ai une table Person (PersonID, Name, ....). Ensuite, j'utilise EF pour créer un modèle Entity puis créer DomainService basé sur Ria Service. Du côté client (sliverlight), j'essaye de créer un linq dynamique pour la fonction de filtre. Ce que j'ai fait est:Comment créer une requête linq dynamique pour un filtre basé sur le service ria?

q = EntityQuery<MyData.Person> 
q = q.Where(p=> p.Name.Contains(NameVar)); 

C'est très bien. Ensuite, j'ai deux autres tables pour le téléphone:

Phone(PhoneID, PhoneNumber, ...) 
PersonPhone(PersonID, PhoneID, ...) 

Ensuite, je veux ajouter un filtre pour correspondre PhoneNumber. Comment écrire la requête linq q like?

q = q.Where(p => p.PersonPhone. 
        Where(ph=>ph.PhoneNumber.Contains(PhoneVar)&& ph.PersonID == p.PersonID).Count()>0); 

je peux passer la compilation du, mais quand exécuter l'application, je suis erreur: opérateur Query « Count » est pas pris en charge

Comment résoudre ce problème?

Répondre

0

Cela semble être un bon scénario pour l'écriture d'une méthode de requête personnalisée sur le serveur et l'appel de cette méthode au lieu de la requête par défaut de Person. Les services RIA prennent uniquement en charge un sous-ensemble d'opérations LINQ sur le client, mais vous pouvez utiliser tous les opérateurs LINQ sur le serveur.

0

Vous devez utiliser le QueryBuilder

Voici un échantillon

var qb = new QueryBuilder<Person>().Where(p => p.PersonPhone.Where(ph=>ph.PhoneNumber.Contains(PhoneVar)&& ph.PersonID == p.PersonID).Count()>0); 

Ensuite, vous pouvez prendre qb et l'appliquer à tout requête que vous le souhaitez.

query = qb.ApplyTo(query); 

En utilisant Func<QueryBuilder<Person>> vous pouvez passer autour de votre filtre dynamique dans les contrôles communs et etc. Et quand vous invoquez la fonction que vous obtiendrez les valeurs actuelles de ce ViewModel.