2010-05-06 10 views
0

Je veux transférer la déclaration suivante à SubSonic 2,2subsonique 2 rejoindre sur plusieurs colonnes

SELECT b.* 
    FROM tableA a 
     INNER JOIN tableB b 
     ON (a.year = b.year AND a.month = b.monath AND a.userid = b.userid); 

Mon problème est que la commande de SqlQuery.LeftInnerJoin subsonique() n'a pas de surcharge qui prend plus d'une colonne.

Depuis une jointure peut être réécrite en utilisant uniquement les clauses where, je ne le suit dans mon sql:

SELECT b.* 
    FROM tableA a, tableB b 
    WHERE a.year = b.year 
     AND a.month = b.month 
     AND a.userid = b.userid 

qui devrait fournir le même résultat (en fait, au moins pour MySQL, il est logique absolument pas différence entre ces déclarations).

Mais je me suis également retrouvé bloqué en le transférant à subsonic parce que le membre "IsEqualTo (...)" est assez intelligent pour comprendre que mon paramètre est une chaîne et le met entre guillemets.

DB.Select("TableB.*") 
    .From<TableA>() 
    .From<TableB>() 
    .Where(TableA.YearColumn).IsEqualTo("TableB.Year") 
    .And(TableA.MonthColumn).IsEqualTo("TableB.Month") 
    .And(TableA.UseridColumn).IsEqualTo("TableB.UserId") 

(j'ai essayé différentes façons de régler le paramètre IsEqualTo)

IsEqualTo(TableB.YearColumn) 
IsEqualTo(TableB.YearColumn.QualifiedName) 

Soit le paramètre est interprété comme

TableA.Year = 'TableB.Year' 

ou je reçois un SqlQueryException. Est-ce que quelqu'un peut me dire comment faire cette requête avec subsonic (Soit le premier - avec JOIN ou le second)? Merci

+0

Avez-vous essayé de vérifier l'instruction SQL générée? à-dire SubSonic.SqlQuery = new SubSonic.Select() A partir de (...;. Console.WriteLine (s.ToString()); – sparks

+0

Oui, comme je l'ai mentionné les bandes de roulement SubSonic mon paramètre comme une chaîne (qui n'entrainera pas un échec mais est faux dans ce cas (SELECT * FROM tableA, tableB WHERE tableA.Year = 'TableB.Year' ne retournera jamais une ligne) –

Répondre

1

Avec SubSonic 2 out of the box vous ne pouvez pas.

Cela dit, vous avez les alternatives suivantes:

Extend SubSonic

Si vous êtes déjà familier avec subsonique, vous pouvez envisager d'ajouter plusieurs colonnes se joint à lui-même subsonique.

Utiliser des vues, des procédures stockées, les fonctions de table

Si vous ne voulez pas salir avec le code Subsonics, utiliser des vues, des procédures stockées et/ou des fonctions de table au sein de SQL Server. SubSonic facilite l'accès aux données à partir des vues et des procédures stockées.

Utilisez un InlineQuery

InlineQuery vous permet d'exécuter une sql - si elle est une option d'avoir sql nu dans votre code.

solution truand avec InlineQuery

Si vous voulez absolument créer votre requête avec subsonique, vous pouvez essayer ceci:

SqlQuery q = DB.Select() 
    .From<TableA>() 
    .CrossJoin<TableB>() 
    .Where(TableA.YearColumn).IsEqualTo(0) 
    .And(TableA.MonthColumn).IsEqualTo(0) 
    .And(TableA.UseridColumn).IsEqualTo(0); 

Construire l'instruction SQL, et remplacer les noms de paramètres:

string s = q.BuildSqlStatement(); 
s = s.Replace(q.Constraints[0].ParameterName, TableB.YearColumn.QualifiedName); 
s = s.Replace(q.Constraints[1].ParameterName, TableB.MonthColumn.QualifiedName); 
s = s.Replace(q.Constraints[2].ParameterName, TableB.UserIdColumn.QualifiedName); 

Ensuite, utilisez s avec InlineQuery.

+0

J'ai utilisé le InlineQuery pour cela, peut-être que je vais étendre la source subsonique plus tard si j'ai un peu de temps d'inactivité. –