0

J'ai un ServiceOperation pour interroger les éléments disponibles à un certain utilisateur à un certain moment. En bref, ce Methode fait:Est-il possible de manipuler QUELQUES entités dans un ServiceOperation retournant un IQueryable

var fullResult = from i in Items where ... select i; //get ALL possible items where..., 

Disons que cela renvoie les éléments {A, B, C, D}. Une deuxième requête filtre les éléments auxquels l'utilisateur appelant a accès.

var clientResult = from ci in fullResult where (privilege's and schedule's are true) 

Cet acarien aboutit à {A, C} et est retourné. Le résultat côté client est: seule la liste des éléments auxquels le client a accès est affichée. Cela peut être gênant puisque vous ne savez pas si vous avez fait une erreur dans la recherche, ou l'article n'est tout simplement pas disponible pour le moment. Ce que je voudrais être en mesure de faire est d'afficher tous les résultats possibles au client {A, B, C, D}, mais FLAG B et D dans ce cas comme indisponible.

Mon entité a déjà une propriété isReadOnly que je pourrais utiliser. Est-ce que je peux écrire une requête non seulement pour filtrer, mais aussi marquer tous les résultats restants en lecture seule? Un résultat idéal serait {A, B.isREadOnly = vrai, C, D.isReadOnly = vrai}

Ou ai-je atteint la limite de ce qui est faisable et dois-je écrire une méthode web WCF traditionnelle, créant un classe séparée, renvoyant une liste de résultats?

PS: cette propriété « isReadOnly » est utilisé que pour cela, je ne me dérange pas d'être changé dans le DB du tout

Merci pour tous les pointeurs

Andreas

Répondre

1

Si je Je considérerais que vous ne renvoyez pas directement l'entité hors de votre service et la mappez à la place à quelque chose qui a la propriété ReadOnly. Par exemple, si votre entité est:

public class A 
{ 
    public string Name { get; set; } 
} 

alors vous pourriez avoir un contrat de données comme ceci:

[DataContract] 
public class AExtra 
{ 
    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public bool IsReadOnly { get; set; } 
} 

ce que cela signifie est que vous pouvez le faire dans votre requête:

var res = from a 
      in Items 
      where (...whatever your original logic is) 
      select new AExtra 
      { 
       Name = a.Name, 
       IsReadOnly = (...put your logic for determining ReadOnly in here) 
      }; 

Puis revenez res de votre opération de service. Juste un avis, mais j'aime faire les choses comme ça plutôt que d'envoyer les entités directement hors du service - cela me donne toujours un peu plus de liberté pour changer les choses sans avoir trop d'effets.

+0

ok, dans ce cas, j'ai un suivi Q. Je devrais créer une entité étendue en plus de ma DB entité mappée dans mon modèle (c'est-à-dire Entité A (DB), AExtra (MyOwnEntity). Pour ce faire, mapper la requête dans un nouveau type, mais comment gérer les modifications? Je suppose que je dois faire un peu de magie dans l'intercepteur de modification Mais que dois-je faire de plus pour sauvegarder les modifications? à ? – Andreas

+0

oui, vous perdez le suivi des modifications lorsque vous faites cela, alors quand vous avez besoin de mettre à jour A, vous devez le récupérer hors du contexte, définissez ses propriétés à partir de AExtra et enregistrez-le.Si le contexte est toujours là, il peut vous renvoyer une version en cache, donc récupérer l'entité et définir les propriétés ne serait pas si inefficace - essayez-le et regardez sql profiler ou quelque chose pour voir les requêtes. J'ai toujours juste utilisé des services de wcf réguliers avec backend de framework d'entité donc je ne peux pas dire s'il y a un moyen dans les services de données que vous pouvez le faire différemment, désolé – kmp

+0

Je vais essayer, il semble être le seule option. Puisque je ferme cette opération avec un autre appel de ServiceOperation, perdre le changement d'acarien de suivi n'importe pas du tout dans ce cas. Merci. – Andreas

Questions connexes