J'ai un scénario dans lequel j'aimerais filtrer certains ensembles d'entités au niveau du modèle, pas au niveau de la requête, c'est-à-dire que je veux fondamentalement coder le filtrage dans mon modèle. ne doit pas toujours répéter la même méthode de filtrage Where dans chaque requête par rapport à un ensemble d'entités. Plus précisément, j'ai un ensemble d'entités CampaignTypes
, et dans le modèle de données que je suis occupé, je ne veux que les types de campagne appartenant à un domaine d'activité donné. Sans le filtrage de niveau inférieur que je cherche, chaque fois que je demande CampaignTypes
je vais devoir utiliser CampaignTypes.Where(ct => ct.BusinessArea == BusinessAreas.Outdoor)
. Comment puis-je éviter ce filtrage répété à court de créer une vue DB et l'utiliser dans mon modèle à la place?Filtrage des ensembles d'entités au niveau du modèle de données
Répondre
public IQueryable<CampaignType> getCampaignTypes()
{
using (var context = new TestEntities())
{
var campaignTypes = context.CampaignTypes.
Where(ct => ct.BusinessArea == BusinessAreas.Outdoor).
AsQueryable<CampaignTypes>();
return campaignTypes;
}
}
Utiliser le résultat de cette méthode, au lieu d'accéder directement à son contexte. Vous pouvez également modifier votre requête pour retourner une liste, un ensemble, etc. en changeant la méthode "AsQueryable" en "AsList", etc.
Vous pouvez ajouter une autre couche (une couche logique) entre le code qui n'a pas besoin de s'inquiéter du filtre et l'ensemble d'entités. Cette couche peut renvoyer un IQuerable ou n'importe quoi et il appliquerait le filtre à l'ensemble d'entités et renverrait les résultats. De cette façon, les autres parties de votre application n'auront pas à s'inquiéter de l'application de ce filtre et c'est toujours une requête unique (dans la plupart des cas) qui s'exécute sur la base de données.
Oui, je l'ai souvent fait auparavant dans ma couche Service, mais j'étais juste curieux quant à toute approche «plus proche du métal». – ProfK
Il peut y avoir. J'éviterais tout ce qui change le code généré, car il sera écrasé dès que vous régénérerez le code. Même dans mes applications simples, j'ai un niveau intermédiaire, même si c'est juste un niveau logique mince, comme c'est habituellement nécessaire à un moment donné. –
Vous pouvez créer une autre propriété avec un nom différent dans un autre fichier, en étendant la classe partielle principale de votre modèle.
EDIT:
namespace YourNameSpace
{
using System.Data.Objects;
public partial class SomeModelEntities
{
public ObjectSet<CampaignType> FilteredCampaignTypes
{
get
{
if ((_CampaignType == null))
{
_CampaignType = base.CreateObjectSet<CampaignType>("CampaignType");
}
return _CampaignType.Where(ct => ct.BusinessArea == BusinessAreas.Outdoor);
}
}
}
}
Je ne suis pas sûr de ce que vous entendez par "dupliquer avec un nom différent dans un autre fichier", mais je n'aime pas changer le code généré, surtout au début du développement car je re-générer le modèle assez souvent. – ProfK
- 1. Filtrage MDX au niveau des faits
- 2. Autorisation au niveau du modèle dans Rails
- 3. Django - meilleure évaluation des relations au niveau du modèle
- 4. Filtrage des sous-ensembles à l'aide de Linq
- 5. Django gère les URLs non-existantes au niveau du modèle
- 6. Comment désinfecter des champs de chaînes contenant du HTML au niveau du modèle?
- 7. Transmettre des ensembles de données
- 8. Définition des autorisations au niveau du modèle dans le code du panneau d'administration Django
- 9. Filtrage de courrier indésirable par courrier électronique au niveau du code en Java
- 10. Filtrage des données de l'accéléromètre
- 11. Transmission des données du modèle au javascript externe
- 12. Port SQL LINQ avec jointure externe gauche avec l'agrégation et le filtrage au niveau du bit
- 13. Filtrage Formats de modèle de modèle
- 14. CanCan et des ensembles de données
- 15. Encore une fois, Flex 4, ActionScript Filtrage des données complexes du filtre XMLList et des ensembles de données avec des conditions spéciales
- 16. Filtrage des données avec jquery
- 17. Filtrage du jeu de données avec condition
- 18. Liaison de données bidirectionnelle Silverlight au niveau des touches
- 19. Comment utiliser le modèle objet SharePoint pour créer des groupes au niveau du site actuel au lieu du premier niveau de site
- 20. ASP.NET Filtrage dynamique des données
- 21. Filtrage des données dans R
- 22. détection Groupe ensembles de données
- 23. Manipulation du clavier au niveau du formulaire
- 24. ACL au niveau du champ dans Grails
- 25. Création de VIEW au niveau du système
- 26. Internationalisation au niveau de la base de données
- 27. Réplication SQL Server au niveau du logiciel?
- 28. Validation côté client au niveau du modèle ou du formulaire avec ASP.NET MVC3
- 29. Filtrage des données dans un tableau
- 30. Filtrage des données à l'aide du champ d'observation ajax
juste un conseil: j'ai appris à ne pas utiliser les blocs 'using' comme ça pour les requêtes EF. Cela entrave le chargement paresseux, car lorsqu'un client tente d'accéder à une propriété de navigation qui n'a pas encore été chargée, EF peut essayer de le charger et de trouver le contexte déjà disposé, et vous envoyer une exception grossière. – ProfK
Merci, ProfK. Je suis beaucoup en utilisant le chargement paresseux, donc je n'étais pas au courant de cela. Je vais regarder de plus près ce soir (au travail en ce moment) et déterminer si je devrais supprimer ma réponse ou la modifier. –