2009-11-03 3 views
0

J'ai un problème lors de l'utilisation LINQ pour définir une clause where sur une requête dans un appel de service de domaine. Si je ne mets pas une clause where cela fonctionne très bien et je récupère mon résultat dans mon événement terminé (j'ai seulement implémenté le eventhandler pour l'événement terminé pour montrer mon problème ici). Si je mets une clause where sur la requête, j'obtiens simplement une liste vide. Et la clause where doit renvoyer 1 ligne :)clause Where sur un appel de service de domaine

LoadOperation<User> load = 
    _Context.Load(_Context.GetUsersQuery().Where(f => f.UserID == UserID)); 
load.Completed += (se, ea) => 
    MyList.ItemsSource = load.Entities.FirstOrDefault(); 

Un commentaire serait apprécié!

Répondre

1

AFAIK Je ne crois pas qu'il soit possible de mettre la clause where des requêtes RIA Services comme ça. Vous devez implémenter une méthode dans votre service qui prend l'ID utilisateur et place la clause where sur la requête dans le service.

Voici un exemple de Brad Abram's blog series on the subject:

public IQueryable<SuperEmployee> GetSuperEmployee(int employeeID) 
{ 
    return Context.GetEmployees().ToList() 
      .Where(emp => emp.EmployeeID == employeeID).AsQueryable(); 

} 
+0

pouvez-vous me dire ce que sera la requête si employeeID est remplacé IList employeeIds et je veux trouver tous emp.employeeID dans employeeIds. ..J'espère que j'étais clair avec ma question – Sumit

+0

Je pense que vous devriez poster cette question comme une question, pas un commentaire. – Bryant

0

Selon cette post

Le "dans" n'est pas une syntaxe valide lors de l'appel des services RIA. Cependant, vous pouvez créer une expression de prédicat qui fait exactement ce que "in" ferait.

Utilisation:

var ids = new[] { 10, 20,30}; 
var inExpression = BuiltInExpression (ids); 

EntityQuery<Product> listQuery = 
    ProductContext.GetProductsQuery().Where(inExpression); 

Code de soutien:

static Expression<Func<Product, bool>> BuiltInExpression(int[] ids) 
{ 
var inputExpression = Expression.Parameter(typeof(Product), "input"); 
var valueExpression = Expression.Property(inputExpression, s_propertyInfo); 
var inExpression = 
ids 
.Aggregate( 
default(Expression), 
(acc, v) => 
{ 
    var vExpression = Expression.Constant(v, typeof(int?)); 
    var compareExpression = Expression.Equal(valueExpression, vExpression); 
    if (acc == null) 
    { 
    return compareExpression; 
    } 
    return Expression.OrElse(acc, compareExpression); 
}); 

inExpression = inExpression ?? Expression.Constant(true); 
return Expression.Lambda<Func<Product, bool>>( 
    inExpression, 
    inputExpression 
); 

return inExpression; 

}