2009-09-29 3 views
2

J'utilise la suppression logique dans mon système et souhaite que tous les appels effectués vers la base de données soient filtrés automatiquement.Filtrer chaque appel effectué par un DataContext lors de l'utilisation d'Entités LinQ

Disons que je suis chargement des données de la base de données de la manière suivante:

product.Regions 

Comment pourrais-je filtrer toute demande faite depuis Regions est un EntitySet<Region> et non une méthode personnalisée donc pas me permettre d'ajouter isDeleted = 0

jusqu'à présent, je trouve AssociateWith mais je ne voudrais pas avoir à écrire une ligne de code pour chaque table -> Association du projet en cours ...

Je suis à la recherche dans ei la construction d'expressions génériques lambda ou .. quelque chose d'autre?

+0

J'espère que vous trouverez une réponse. Je ne peux pas me rappeler combien de fois j'ai écrit ".Where (i => i.IsVisible)": p – JustLoren

+1

Bien que cela puisse ne pas aider du tout - faire cela dans NHibernate est assez simple en utilisant soit des filtres ou des conditions dans votre mapping ... – Rashack

+0

+1 pour vous commenter pour me rappeler que Linq to SQL n'est pas le seul OU/M et que parfois la solution n'est pas si facilement obtenue;) – Mathlec

Répondre

0

Il me semble que vous utilisez une relation entre vos classes Product et Region. Si oui, alors quelque part, (le fichier .dbml pour LINQ to SQL généré automatiquement), il existe une application qui définit la relation:

[Table(Name = "Product")] 
public partial class Product 
{ 
    ... 
    private EntitySet<Region> _Regions; 
    [Association(Storage = "_Regions")] 
    public EntitySet<Region> Regions 
    { 
     get { return this._Regions; } 
     set { this._Regions.Assign(value); } 
    } 
    ... 
} 

Vous pouvez mettre une certaine logique dans l'accesseur ici, par exemple :

public IEnumerable<Region> Regions 
{ 
    get { return this._Regions.Where(r => !r.isDeleted); } 
    set { this._Regions.Assign(value); } 
} 

De cette façon, chaque accès à travers le produit.Régions retournera votre Enumerable filtré.

+0

J'ai une relation entre mes entites dans mon DBML. Votre idée est bonne mais je vais devoir ajouter ces "filtres" manuellement pour CHAQUE relation !! Je cherche quelque chose de plus ... générique. – Mathlec

+0

Et btw, this._Regions.Where retournera un IEnumerable et pas un EntitySet. – Mathlec

1

Vous pouvez créer une méthode d'extension qui implémente votre filtre et l'utilise comme convention.

public static class RegionQuery 
{ 
    public static IQueryable<Region> GetAll(this IQueryable<Region> query, bool excludeDeleted=true) 
    { 
     if (excludeDeleted) 
      return query.Regions.Where(r => !r.isDeleted); 

     return query.Regions; 
    } 
} 

Donc, chaque fois que vous voulez interroger pour les régions que vous pouvez faire l'appel suivant pour obtenir que les régions en direct offrant encore une chance d'obtenir à ceux supprimés.

context.Regions.GetAll(); 

Cela peut être un peu bancal pour accéder à la propriété Products, mais toujours faisable. Le seul problème est que vous devez vous conformer à la convention. Ou étendez la classe contenant.

someProduct.Regions.GetAll(); 

J'espère que cela aide. C'est ce que j'ai fini par régler parce que je n'ai pas été capable de trouver une solution à cela, que ce soit en dehors de créer plus d'indirection. Faites-moi savoir si vous ou quelqu'un d'autre propose une solution à celui-ci. Je suis très intéressé.

Questions connexes