2017-06-22 2 views
3

J'ai une configuration de table parent/enfant - Items/ItemDetails. Cette partie fonctionne:ServiceStack.OrmLite Utilisation de la limite dans le filtre SQL.In

var q = db.From<Item>(); //various where clauses based on request 
    items = db.Select<Item>(q); 
    q = q.Select(a => a.ITEM_NO); 
    itemDetails = db.Select<ItemDetail>(x => Sql.In(x.ITEM_NO, q)); 

Essayer d'ajouter radiomessagerie pour améliorer les performances de cette demande de grands ensembles de données, je vais avoir du mal à obtenir la fonction .Limit (sauter, lignes) à travailler dans la déclaration SQL.In de la table de l'enfant.

var q = db.From<Item>().Limit(skip, rows); 
    items = db.Select<Item>(q); 
    q = q.Select(a => a.ITEM_NO); 
    itemDetails = db.Select<ItemDetail>(x => Sql.In(x.ITEM_NO, q)); 

Il fonctionne en limitant les résultats dans la première sélection, mais lorsqu'il est utilisé dans les données de l'enfant tirer je reçois « Une seule expression peut être spécifiée dans la liste de sélection lorsque la sous-requête est pas introduite par exists. »

Le SQL qui vient change où le sous-requête à:

WHERE "ITEM_NO" IN (SELECT * FROM (SELECT "ITEM_NO", ROW_NUMBER() OVER 
    (ORDER BY "ITEM"."ITEM_NO") As RowNum 
    FROM "ITEM") AS RowConstrainedResult WHERE RowNum > 5 AND RowNum <= 15) 

Je comprends l'erreur SQL est parce que je choisissais plus d'une colonne dans la clause IN. Y a-t-il une meilleure façon d'écrire ceci pour éviter l'erreur?

Merci

Répondre

1

Si vous utilisez SQL Server 2012 ou plus tard, vous devez utiliser SqlServer2012Dialect.Provider, par exemple:

container.Register<IDbConnectionFactory>(c => 
    new OrmLiteConnectionFactory(connString, SqlServer2012Dialect.Provider)); 

qui permet OrmLite utiliser le support d'échange ajouté dans SQL Server 2012 au lieu de recourir à utiliser la fonction de fenêtrage hack nécessaire pour implémenter la pagination pour les versions antérieures de SQL Server.

+0

Nous avons toujours des utilisateurs hérités qui n'ont pas mis à niveau au-delà de 2008 R2. – Mark