2010-05-14 15 views
0

Avertissement: J'ai sauté à C# 2008 récemment et SubSonic 3 (3.0.0.4) en même temps. Je n'ai pas utilisé Linq pour beaucoup de choses dans le passé.Manière simple d'utiliser les valeurs de clé étrangère pour le tri?

Existe-t-il un moyen facile d'utiliser la valeur d'affichage de clé étrangère pour le tri, plutôt que l'ID FK (qui est numérique)?

J'ai ajouté une nouvelle méthode de recherche dans mon ActiveRecord.tt pour aider à trier basé sur un nom de champ de chaîne mais après avoir fait quelques essais j'ai réalisé que bien que fonctionnant comme il devrait être, je ne manipule pas la clef étrangère champs du tout (ils trient juste par leur valeur).

Même si j'ai besoin de changer la façon dont j'accède aux données, il est assez tôt dans le projet pour le faire. Je cherche juste des suggestions.

Répondre

0

Vous avez donc la table A dont l'ID de la table B est une clé étrangère et vous souhaitez trier la table A par la colonne DisplayName de la table B plutôt que l'ID de la table B?

La seule façon d'obtenir ceci est d'une jointure.

SELECT tableA.* FROM tableA INNLER JOIN tableB ORDER BY tableB.DisplayName 

En SubSonic2 vous pouvez le faire, et être encore capable de mettre à jour vos dossiers si vous utilisez la méthode DB.Select (...). ExecuteCollection de(). Je pense que cela devrait aussi être possible avec subsonic3. Cependant, si vous n'utilisez pas la clé étrangère et que le nom d'affichage est unique, vous devez simplement utiliser cette valeur comme clé étrangère.

+0

Dans mon cas, je ne pas besoin de modifier l'enregistrement. J'utilise ceci pour remplir une grille. La grille est supposée supporter la pagination et le tri par champ cliqué (premier asc, puis deuxième clic sur le même champ). Votre suggestion de lien vers le champ d'affichage plutôt que l'Id travaillerait pour moi dans la plupart des cas, bien qu'il y aura des cas où il ne va pas. Je vais examiner toutes mes options et faire d'autres recherches avant de décider de la meilleure façon de procéder. –

1

LINQ est votre ami dans cette situation, il vous suffit de joindre vos deux objets et puis trier par la propriété de votre objet étranger:

var primaryObjectsSorted = 
    from primaryObjects in PrimaryObject.All() 
    join foreignObjects in ForeignObject.All() 
    on primaryObjects.ForeignId equals foreignObjects.Id 
    orderby foreignObjects.PropertyYouWantToSortOn 
    select primaryObjects; 
+0

Adam, J'ai travaillé avec quelque chose comme ça la nuit dernière, mon problème est que mon champ de tri et mon ordre sont dynamiques. C'est pourquoi j'ai développé une méthode Find personnalisée dans le activerecord.tt. Je suppose que je pourrais faire la même chose avec le code LINQ, mais en pensant plus à ce sujet, je pense que la conception de mon DB pourrait être plus problématique. Mon FK pourrait être (comme l'a dit SchlaWiener) le champ d'affichage qui est également unique dans ce cas. Cependant, je suis certain qu'à un moment donné, j'aurai besoin de plus et que LINQ semble gérer 99% de ce dont j'ai besoin. J'ai besoin de réfléchir plus profondément, je crois. –