2009-02-12 8 views
3

Salut tout J'ai une base de données horribles que je dois travailler et linq to sql est l'option im prendre pour récupérer des données. anywho Im essayant de réutiliser une fonction en jetant dans un nom de table différent basé sur une sélection d'utilisateur et il n'y a aucun moyen à ma connaissance de modifier le TEntity ou la table <> dans une requête DataContext.Noms de tables dynamiques dans Linq to SQL

Ceci est mon code actuel.

public void GetRecordsByTableName(string table_name){ 

string sql = "Select * from " + table_name; 
var records = dataContext.ExecuteQuery</*Suppossed Table Name*/>(sql); 

ViewData["recordsByTableName"] = records.ToList(); 
} 

Je souhaite remplir mon ViewData avec des enregistrements Enumerable.

Répondre

3

Vous pouvez appeler la méthode ExecuteQuery sur l'instance DataContext. Vous voulez appeler la surcharge qui prend une instance de type, décrite ici:

http://msdn.microsoft.com/en-us/library/bb534292.aspx

En supposant que vous avez un type qui est attribué correctement pour la table, en passant cette instance de type pour ce type et le SQL sera vous donner ce que vous voulez.

+1

-vous ennuierait fournir un exemple. – Ayo

+0

Bien, je n'ai jamais su ça. – jeremcc

0

Comme casperOne a déjà répondu, vous pouvez utiliser la première surcharge de la méthode ExecuteQuery (celle qui demande un paramètre Type). Étant donné que j'ai eu un problème similaire et vous demandé un exemple, voici une:

public IEnumerable<YourType> RetrieveData(string tableName, string name) 
     { 
      string sql = string.Format("Select * FROM {0} where Name = '{1}'", tableName, name); 

      var result = YourDataContext.ExecuteQuery(typeof(YourType), sql); 

      return result; 
     } 

attention à YourType puisque vous devrez définir un type qui a un constructeur (il ne peut pas être abstraite ou interface). Je vous suggère de créer un type personnalisé qui a exactement les mêmes attributs que votre table SQL. Si vous faites cela, la méthode ExecuteQuery injectera automatiquement les valeurs de votre table dans votre type personnalisé. Comme ça:

//This is a hypothetical table mapped from LINQ DBML 

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.ClientData")] 
    public partial class ClientData : INotifyPropertyChanging, INotifyPropertyChanged 
    { 
private int _ID; 

     private string _NAME; 

     private string _AGE; 
} 

//This would be your custom type that emulates your ClientData table 

public class ClientDataCustomType 
    { 

     private int _ID; 

     private string _NAME; 

     private string _AGE; 
} 

Ainsi, sur l'exemple précédent, la méthode ExecuteQuery serait:

var result = YourDataContext.ExecuteQuery(typeof(ClientDataCustomType), sql);