0

J'ai besoin de l'aide par écrit une requête, ci-dessous je l'ai écrit des classes avec des propriétés Needful pour cet exemple que (je ne l'ai pas montré les tables DB qui génère ef)Aide dans Entity Framework 4.1 Interrogation

//this class will create a unique id for each location may be country, 
state or city 
public class Location 
{ 
    public int Id { get; set; } 
    public string Name { get; set; }  
    public string Discriminator{get;set;} 

    public int? ParentLocationId { get; set; } 
    public Location ParentLocation { get; set; } 

    public ICollection<Location> ChildLocations { get; set; } 
} 

données Emplacements exemples

Id | Name | Discriminator | ParentLocationId 
1 | India | Country | null 
2 | Karnatka | State | 1 
3 | Maharashtra | State | 1 
4 | Banglore | City | 2 


//this will contain all product categories + products itself 
public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Category ParentCategory { get; set; } 
    public int? ParentCategoryId { get; set; } 

    public ICollection<Category> ChildCategories { get; set; } 
} 

catégorie échantillon de données

Id | Name | ParentCategoryId 
1 | Electronics | Null 
2 | Mobiles | 1 
3 | Apple | 2 
4 | Nokia | 2 
5 | I phone-4 | 3 
6 | Nokia-Some Model | 4 

J'ai utilisé une variable de type = utilisateur dans la classe ci-dessous, mais je have'nt montré « utilisateur » classe ici car il ne contient aucune chose spl

public class Purchase 
{ 
    public int Id { get; set; } 

    public User User { get; set; } 
    [Required] 
    public int UserId { get; set; } 

    public Category Category { get; set; } 
    [Required] 
    public int CategoryId { get; set; } 

    public Location Location { get; set; } 
    [Required] 
    public int LocationId { get; set; } 
} 

Remarque pour un achat réussi pour LocationID doit être CityID et categoryId devrait être plus bas dans la hiérarchie, par exemple categoryId ne peux pas être mobile, il devrait être iphone-4 ou nokia-some-modèle

Maque e les commandes d'achat de données

Id | CategoryId | LocationId | UserId 
1 | 5 | 4 | 1 
1 | 5 | 4 | 2 
1 | 5 | 4 | 3 

Jusqu'à présent, tout fonctionne bien pour moi, Voici ma question

Iam création mécanisme de filtrage où je fournir 2 choses LocationID (cet endroit peut être ID du pays , état ou ville) et ID produit (ce produit peut être n'importe où dans la hiérarchie, par exemple cette valeur peut être ID de l'électronique ou mobile ou apple ou iphone) et obtenir une liste de tous les achats effectués qui satisfait ce

par exemple: exemples de filtres que je peux faire

  • a> trouver toutes les ventes mobiles dans un état (passer categoryId de mobile et LocationID d'un état particulier)
  • b> trouver toutes les ventes nokia dans un pays (passer categoryId de nokia et LocationID d'un pays) et ainsi de suite ..

Je suis ouvert à toute suggestion aussi vous pouvez me faire savoir s'il y a quelque chose qui est pas été correctement expliquée dans cette question.

Répondre

1

Ce sont des requêtes hiérarchiques qui sont IMHO impossibles à faire efficacement dans linq-to-entities car linq-to-entities n'a aucun support pour la récursivité nécessaire pour naviguer dans la hiérarchie.

Ces requêtes fonctionnent mieux avec un certain support de la base de données - dans le cas de SQL Server 2005 et plus récent, vous pouvez utiliser CTE and hierarchical queries. Les CTE peuvent être utilisés dans les vues de base de données qui peuvent à leur tour être mappées à l'entité dans EF, mais cela ne vous permettra pas de créer les critères de filtrage dont vous avez besoin car la vue peut avoir uniquement une structure statique.

Par exemple, vous pouvez utiliser CTE pour définir la vue renvoyant CityId et son CountryId en enregistrement unique. Vous pouvez ensuite utiliser cette vue et la joindre aux achats et filtrer par CountryId. Mais que faire si vous avez besoin de rechercher par StateId?Votre vue n'a actuellement pas de colonne StateId définie - vous pouvez l'ajouter comme une autre colonne mais cela ne fera que compliquer tout - vous devrez savoir si vous devez filtrer par pays ou par état. Que faire si vous avez un autre niveau? Et un de plus? Et si vous ne pouvez pas dire d'avance combien de niveaux avez-vous? C'est exactement ce qui peut arriver avec les catégories. La vue ne vous aidera pas. Cela serait probablement possible, si EF avait un support pour les fonctions de table - vous créeriez une fonction de valeur table pour Locations (il retournerait dynamiquement toutes les villes appartenant à LocationId) en utilisant CTE en interne et une fonction similaire pour Catégories et vous cartographierait ces fonctions dans EDMX et les utiliserait dans les jointures dans les requêtes linq-to-entities. Il y a un problème - EF ne supporte pas encore les fonctions de table de mappage - il est prévu pour next major release.

Si vous avez besoin de ce type de recherche, vous avez besoin de SQL + CTE.

+0

Je pense que vous êtes la seule personne à gauche sur ce site qui connaissent le travail de cadre entité ABT, toutes les réponses EF que je vois, je vous vois !! –

Questions connexes