2009-12-30 4 views
0

OK, tout d'abord, je suis tout nouveau à LINQ2SQL alors excusez mon ignorance.LINQ to SQL - Restreindre la relation par condition (un à plusieurs) (1 - M)

J'ai fait quelques recherches, mais après 1 heure, j'ai décidé de venir ici.

va ici:

Je suis en train de faire quelque chose que je pense est très simple. Ce pourrait juste être que je ne comprends pas. J'utilise LINQ 2 SQL, via le concepteur VS. J'ai 2 tables: Clients et Catégories. Un client peut avoir plusieurs catégories.

J'ai une requête très simple pour trouver des clients:

Client c = db.Clients.SingleOrDefault(client => client.ID == id); 

Ce que je veux faire est de modifier cette façon que la collection: c.Categories, ne contiendront un sous-ensemble des catégories de ce client.

Voici ce que j'ai essayé:

Client c = db.Categories.Where(cat => cat.IsActive == true).Select(cat.Clients).SingleOrDefault(client => client.ID == id); 

je reçois une erreur déclarant que plus d'un client est retourné.

  1. Ai-je raté quelque chose? N'est-ce pas quelque chose que LINQ est conçu pour faire?
  2. Suis-je censé utiliser la première requête puis faire une autre requête spécifiquement sur les Catégories quand j'ai besoin de cette liste ??

    c.Categories.Categories.Where (cat => cat.IsActive == true)

Merci à l'avance. SingleOrDefault() est pour quand il n'y a qu'un seul résultat.

+0

comment voulez-vous limiter la liste des catégories pour un client? Y a-t-il par exemple un champ "IsActive (bool)" sur la table des catégories que vous souhaitez regarder? –

+0

C'est exactement ce que j'essaie de faire. – Kevin

Répondre

1

Il semble qu'il y ait plus d'un enregistrement qui a cet identifiant. Essayez d'utiliser FirstOrDefault() à la place.

Client c = db.Categories.Where(cat => cat.Name == "Name").Select(cat.Clients).FirstOrDefault(client => client.ID == id); 
+0

Il compile et s'exécute, mais la condition (cat.Name == "Name") est totalement ignorée. – Kevin

+0

OK, en regardant votre code, je suis vraiment confus quant à ce que vous essayez d'accomplir. Qu'est-ce que vous cherchez à faire exactement? Cherchez-vous à supprimer des enregistrements de la base de données? – BFree

+0

Je viens de copier le commentaire de Marc: comment voulez-vous restreindre la liste des catégories pour un client? Y a-t-il par exemple un champ "IsActive (bool)" sur la table des catégories que vous souhaitez regarder?- marc_s il ya 30 minutes Est-ce que cela a du sens? – Kevin

1

Le problème est que la partie Categories.Where en combinaison avec le Select, retourne une collection de collections. Ce que vous devez faire est soit utiliser SelectMany, ou utiliser Single (ou SingleOrDefault, ou First ou FirstOrDefault) au lieu de Where.

Exemples:

Client c = db.Categories.Where(cat => cat.IsActive) 
         .SelectMany(cat.Clients) 
         .SingleOrDefault(client => client.ID == id); 

ou

Client c = db.Categories.Single(cat => cat.IsActive) 
         .Clients 
         .SingleOrDefault(client => client.ID == id); 
+0

Le 2ème ne va pas fonctionner. J'ai besoin de TOUTES les catégories avec ce nom ... Peut être le nom est un mauvais exemple ... Laissez-moi modifier ma question initiale – Kevin

+0

Vous avez toujours fait l'erreur, vous avez besoin de SelectMany dans votre cas. –

Questions connexes