2010-03-30 27 views
0

Je suis peut-être en train de vaguer ici, mais je cherche un bon endroit pour mettre des opérations auxiliaires basées sur linq pour faire des choses. comme;Quelle est la convention pour étendre Linq datacontext avec des opérations auxiliaires basées sur un ensemble spécifique à une seule collection d'entités?

db.Selections.ClearTemporary() 

qui fait quelque chose comme

db.DeleteAllOnSubmit(db.Selections.Where(s => s.Temporary)) 

Depuis que je peux comprendre comment étendre Table<Selection> le meilleur que je peux faire est de créer une méthode statique dans la classe partielle de sélection (similaire à Ruby), mais je passer dans le datacontext comme;

Selection.ClearTemporary(MyDataContext) 

Ce genre de suce parce que j'ai deux conventions pour faire des opérations à base de set et je dois passer le contexte de données à la classe statique.

J'ai vu d'autres personnes recommander d'empiler des méthodes d'aide dans une partie du contexte de données comme;

myDataContext.ClearTemporarySelections(); 

Mais je pense que cela fait de la DC un dépotoir pour les opérations de cohésion.

Sûrement il me manque quelque chose. J'espere. Quelle est la convention?

Répondre

2
public static class LinqExtensions 
{ 
    public static void Clear<T>(this Table<T> t, Expression<Func<T,bool>> pred) 
    { 
    t.DeleteAllOnSubmit(t.Where(pred)); 
    } 
} 

Utilisation:

db.Selections.Clear(x => x.Temporary); 

Si nécessaire, le DataContext est accessible à partir d'un Table<T>.

+0

Donne-moi quelque chose d'autre à travailler mais s'applique à toutes les entités. Depuis .Selections est en réalité getter pour un type générique Table et pas une classe je suppose que l'extension de ceux-ci sont une impasse. Désolé de répondre si tard que je n'ai jamais reçu de notification par email de ceci. –

+0

Ajout de 'SubmitChanges' est une idée terrible ici (extrêmement non intuitive avec des effets secondaires imprévisibles). Je vais transformer mon -1 en +1 sans ça. –

+0

Je viens de réaliser que vous avez répondu par le titre de la question parfaitement - bonne réponse question stupide. J'ai édité le titre de ma question mais quel est le protocole? –

0

Je pense à créer des classes imbriquées partials du datacontext plus un getter qui initialise et retourne la classe imbriquée

public SelectionsHelperClass SelectionsHelper { 
    get { 
    return new SelectionsHelperClass(Selections) 
    } 
} 

De cette façon, je peux faire db.SelectionsHelper.ClearTemporary() sans passer dans le contexte tout en gardant les opérations en fonction de réglage (opérations de collecte) spécifiques aux sélections logiquement ensemble. Je n'ai pas testé ça.

Quelque chose que j'ai oublié de mentionner est que cette raison que je veux ces aides est qu'ils sont fréquemment partagés par certains mais pas tous les contrôleurs dans une application asp mvc et je cherche un endroit pour les refactoriser aussi.

+0

J'ai testé ça et ça marche bien. Ma première utilisation était pour une table de recherche - Alors maintenant je peux faire des choses comme db.LookupsHelper.GetDropDownValues ​​("User.Type"); au lieu de - à partir de l dans db.lookups où attribut == "User.Type" select new {l.lookupid, l.displaytext} –