0

Salut, je peux obtenir de l'aide d'un expert dans ActiveRecord?OrderBy In A HasAndBelongsToMany Relation

Je cherche une solution pour une relation HasAndBelongsToMany. J'ai actuellement les suivantes

[HasAndBelongsToMany(Table = "SupplierRecordUrls",ColumnKey = "SupplierID", ColumnRef = "RecordUrlID", Lazy = true, OrderBy="??")] 
    public virtual IList<RecordUrl> RecordUrls 
    { 
     get; 
     set; 
    } 

Comment puis-je commander la relation ci-dessus par une colonne « RecordUrl », par exemple ... « Nom Asc ». J'ai essayé faisant référence à une colonne directement dans la RecordUrl de classe, mais je reçois un « ne peut pas trouver la colonne « xxxxxx » erreur.

Toute aide est très appréciée.

+0

OrderBy prend SQL, pas HQL/NHibernate/ActiveRecord. Peut-être que vous spécifiez un nom de propriété au lieu d'un nom de colonne SQL? –

Répondre

0

Vous pouvez trouver un OrderBy in a HABTM relation here.

Ajouter Trier à la définition de votre relation, créez un qui implémente IComparer Comparer et qui fera l'affaire

Dans votre code, qui donnera somthing comme ceci:.

[HasAndBelongsToMany(Table = "SupplierRecordUrls",ColumnKey = "SupplierID", ColumnRef = "RecordUrlID", Lazy = true, Sort="MyProject.RecordUrlNameComparer, MyProject.RecordUrl")] 
public virtual IList<RecordUrl> RecordUrls 
{ 
    get; 
    set; 
} 

Avec:

public class RecordUrlNameComparer: IComparer<RecordUrl> 
{ 
    Int32 System.Collections.Generic.IComparer<RecordUrl>.Compare(RecordUrl x, RecordUrl y) 
    { 
     return new System.Collections.Comparer(System.Globalization.CultureInfo.CurrentCulture).Compare(x.Name, y.Name); 
    } 
} // public class RecordUrlNameComparer: IComparer<RecordUrl> 

Je vous laisse lire l'article :)

Edit:

Votre erreur est maintenant: Could not instantiate comparator class [MyProject.RecordUrl.RecordUrlComparer, MyProject.RecordUrl] for collection MyProject.Supplier.RecordUrls

Ce que je ferais:

  • Créez le Comparer en tant que classe interne de RecordUrls.

  • Modifier la Trier par: Sort = "MyProject.Supplier.RecordUrl$RecordUrlComparer, MyProject.Supplier.RecordUrl"

Si cela ne fonctionne toujours pas, vous obtenez toujours le « ne pouvait pas instancier » erreur, essayez de faire la classe statique Comparer. Je ne suis pas sûr comment il est utilisé, mais si c'est un appel statique, cela peut faire l'affaire :)

+0

Hé les gars merci pour les réponses! J'ai configuré le IComparer comme vous l'avez demandé, et en essayant de comparer les URL dans l'ordre croissant, par exemple return new System.Collections.Comparer (System.Globalization.CultureInfo.CurrentCulture) .Compare (x.Url, y.Url); J'ai également ajouté Sort = "MyProject.RecordUrlNameComparer, MyProject.RecordUrl" à l'attribut HABTM mais il semble ignorer le paramètre de tri des suggestions? –

+0

Trier! = OrderBy. Le tri se passe côté client, OrderBy arrive côté serveur. –

+0

Je n'utilise pas OrderBy J'utilise Trier, mais je reçois l'erreur suivante: Impossible d'instancier la classe de comparateur [MyProject.RecordUrl.RecordUrlComparer, MyProject.RecordUrl] pour la collection MyProject.Supplier.RecordUrls - Des idées? –