2010-07-01 4 views
2

Mon site utilise Subsonic 2.2 sur mon site.SubSonic Comment exécuter une instruction SQL?

J'ai une situation bizarre où j'ai besoin d'exécuter des instructions SQL ad-hoc.

public IList<string> GetDistincList(string TableName, string FieldName) 
{ 
    string sqlToRun = string.Format("SELECT DISTINCT {0} FROM {1} ORDER BY {0}", FieldName, TableName); 

    Query query = new Query(TableName); 
    query.PleaseRunThis(sqlToRun); 
    query.ExecuteReader(); 

} 

Quelqu'un peut-il m'aider ici? Comme il apparaît, je veux juste retourner une liste générique de chaînes.

Merci!

Répondre

6

Subsonic a une grande méthode appelée ExecuteTypedList() afin que vous puissiez faire somethink comme ça.

List<int> result = DB.Select(Table.Columns.Id) 
    .Distinct() 
    .From<Table>() 
    .OrderBy(Table.Columns.Id) 
    .ExecuteTypedList<int>(); 

ou même avec pocos:

public class UserResult 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
} 


List<UserResult> users = DB.Select(
     User.Columns.UserId + " as Id",  // the as ... is only needed if your 
     User.Columns.UserName + " as Name" // column name differs from the 
    ).From<User>()       // property name of your class 
    .ExecuteTypedList<UserResult>(); 

Malheureusement, cette méthode ne fonctionne pas pour la chaîne car elle nécessite a) un valuetype b) une classe avec un constructeur sans paramètre car la méthode utilise la réflexion pour mapper les colonnes du résultat aux propriétés de la classe

Cependant, j'ai écrit une méthode d'extension il y a un certain temps qui fonctionne pour la chaîne:

Use the Subsonic.Select() ExecuteTypedList Method with String

Regardez ma propre réponse dans le lien.

Si vous ajoutez le extensionmethod à votre code que vous pouvez faire:

List<String> result = DB.Select(User.Columns.UserName) 
         .From<User>() 
         .ExecuteTypedList();  
Questions connexes