2009-08-17 7 views
0

Je ne sais pas comment faire. Je cherche à joindre des colonnes de deux tables ensemble de sorte qu'au lieu de simplement récupérer une clé étrangère, je peux afficher un nom qui se trouve sur la même ligne que l'identifiant étranger.Subsonic 3 InnerJoin

je fait quelque chose comme ça, mais je continué à obtenir une erreur de ma clé primaire:

sqlquery test = db.Select.From() InnerJoin (filesTable.file_typeColumn, filetypesTable.filetype_idColumn) .Lorsque (filesTable.. file_typeColumn) .IsEqualTo (filetypesTable.filetype_idColumn); Impossible de décider quelle propriété considérer la clé - vous pouvez en créer une appelée 'ID' ou en marquer une avec l'attribut SubSonicPrimaryKey Description: Une exception non gérée s'est produite pendant l'exécution de la requête Web en cours. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails d'exception: System.InvalidOperationException: Impossible de décider quelle propriété doit prendre en compte la clé - vous pouvez en créer une appelée 'ID' ou en marquer une avec l'attribut SubSonicPrimaryKey Des suggestions?

Répondre

0

Ce qui suit devrait vous obtenir ce que vous voulez:

SqlQuery test = db.Select() 
    .From<filesTable>() 
    .InnerJoin<filetypesTable>() 

Vous pouvez aussi le faire en utilisant la mise en œuvre de Linq SubSonic:

var fileIdsAndTypeds = from files in filesTable.All() 
    join types in filesTypes.All() 
    on types.filetype_idColumn equals files.filetypeColumn 
    select files; 
+0

Je ne suis pas sûr si je l'ai mis en place alors parce que je ne peux pas sembler ajouter .Schema aux fichiersTable –

+0

dit qu'il n'y a pas de surcharge pour la méthode Select qui prend deux arguments. Nous l'avons essayé avec SelectColumns avant, mais cela ne nous a pas semblé aller nulle part non plus. –

+0

Désolé j'utilisais le style SubSonic 2. La version mise à jour de la requête devrait fonctionner. –

0

Pour une raison qui ne cessait de retourner une valeur nulle.

J'ai fini par faire ceci:

DBDB db = new DBDB(); 
     SqlQuery Files = db.SelectColumns(filetypesTable.filetype_idColumn, filetypesTable.filetype_nameColumn, 
      filesTable.purpose_idColumn, filesTable.page_idColumn, filesTable.file_idColumn, filesTable.file_descriptionColumn, 
      filesTable.file_nameColumn, filesTable.file_pathColumn, filesTable.file_typeColumn, filesTable.file_dateColumn) 
       .From<file>() 
       .InnerJoin<filetype>(filesTable.file_typeColumn, filetypesTable.filetype_idColumn); 

List<file> fileList = Files.ExecuteTypedList<file>(); 

Il semble retourner une liste des colonnes réelles sur la première table puis à l'intérieur de cette collection est un autre avec les données de la table jointe ... Maintenant, pour comprendre comment faire pour que cela fonctionne avec DataBind et les colonnes personnalisées Gridview ...

+0

Ran dans un problème avec le type de liste, car techniquement, il est de deux types et pas seulement de fichiers. La seule façon de résoudre ce problème était de faire var fileList = Files.ExecuteReader(); Le problème avec cela est qu'il ne vous permet pas de faire la pagination car il s'agit d'une lecture en direct. –