2011-08-09 3 views
3

je les suivantes 3 tables avec leurs champsLinq Contient et Distinct

Livres (Id_Book | Titre | Année)
Book_Themes (Id | Id_Book | Id_Theme)
Thèmes (Id_Theme | Titre)

J'ai aussi un tableau Giud avec Id_Themes

Guid [] themesArray = new Guid []{new Guid("6236c491-b4ae-4a2f-819e-06a38bf2cf41"), new Guid("06586887-7e3f-4f0a-bb17-40c86bfa76ce")}; 

Je suis en train de faire tous les Livres contenant l'un des Theme_Ids du themesArray

C'est ce que j'ai à ce jour qui ne fonctionne pas. Je ne sais pas comment utiliser Contient dans ce scénario.

int index = 1; int size= 10; 
var books = (from book in DB.Books 
       join bookWThemes in DB.Book_Themes 
       on book.Id_Book equals bookWThemes.Id_Book 

       where themesArray.Contains(bookWThemes.Id_Theme)       
       orderby book.Year 
       select book) 
       .Skip((index - 1) * page) 
       .Take(size); 

Je reçois une erreur sur themesArray.Contains (bookWThemes.Id_Theme): System.Guid [] ne contient pas de définition pour Contains. Aussi je ne suis pas sûr où mettre le Distinct

* ***MISE À JOUR* ***

remarqué que mon modèle avait Id_Theme comme annulable .. J'ai changé le DB et n'ai pas reflété les changements sur mon modèle. Donc, pour répondre à la question s'il est NULL, changez simplement la ligne Contient en themesArray.Contains (bookWThemes.Id_Theme.Value) ... et avec cette modification cela fonctionne.

Merci pour toute l'aide !.

+0

Est-ce une erreur de compilation? – user7116

+0

Linq to Entities ou Linq to SQL? – BrokenGlass

+0

oui c'est une erreur de compilation –

Répondre

0

Il est étrange que votre requête LINQ se décompose sur .Contains. Les trois formes IEnumerable <> et List <> fonctionnent pour moi.

[Test] 
    public void Test43() 
    { 
     var a = new List<Guid>(){new Guid(),new Guid(),new Guid()}; 
     a.Contains(new Guid()); // works okay 
     var b = (IEnumerable<Guid>)a; 
     b.Contains<Guid>(new Guid()); // works okay 
     b.Contains(new Guid()); // works okay 
    } 
+0

merci l'homme ... ça marche maintenant. En fait, j'ai remarqué cela et mis à jour ma base de données et le modèle ... mais il semble que le changement n'a pas reflété sur mon modèle. Donc, si c'est nullable juste utilisé ceci où themesArray.Contains (bookWThemes.Id_Theme.Value) ... Je ne fais que réparer mon modèle –

0

Pour la « distincte » question, mettre l'appel ici:

  select book) 
      .Distinct() // <-- 
      .Skip((index - 1) * page) 
+0

merci cdhowie, la question est plus sur la façon d'utiliser les Contains ... Juste édité la question pour refléter cela –

+0

Je viens de trouver la section Contient ... maintenant le distinct. J'ai mis le Distinct comme vous l'avez conseillé et j'ai reçu ce message - La méthode 'Skip' est seulement supportée pour l'entrée triée dans LINQ to Entities. La méthode 'OrderBy' doit être appelée avant la méthode 'Skip'. –

+0

Oups, je suppose que vous ne pouvez pas lancer l'appel 'Distinct()' - vous devez l'insérer avant le 'orderby'. Voir [cet article] (http://introducinglinq.com/blogs/marcorusso/archive/2008/07/20/use-of-distinct-and-orderby-in-linq.aspx). – cdhowie

0

Essayez le casting Guid[] à List<Guid> et vous pouvez utiliser Contient dessus.

where themesArray.ToList().Contains(bookWThemes.Id_Theme) 
+0

a eu quelques erreurs de compilation. 1. La meilleure méthode surchargée pour 'System.Collections.Generic.List .Contains (System.Guid)' a un argument non valide. 2.cans de conversion depuis 'System.Guid?' à 'System.Guid' –

+0

ok c'est ce que j'ai fait pour le résoudre - où themesArray.Contains (bookWThemes.Id_Theme.Value) –

+2

@Rodrigo: Cela signifie que votre propriété 'Id_Theme' est nulle dans votre modèle de données. Sans que vous publiez ce que vos entités ressemblent exactement personne ne pouvait savoir – BrokenGlass