2010-11-17 5 views
4

J'utilise LINQ to SQL en C# dans mon application. Je dois être en mesure de sélectionner une colonne d'une ligne, en fonction d'une variable. C'est facile pour la ligne car c'est une clause where simple, mais je ne sais pas quoi faire en sélectionnant une colonne spécifique. Voici mon code jusqu'à présent:Sélectionner une colonne basée sur une variable dans LINQ to SQL

var permissions = (from s in dc.Permissions where s.dashboardname == permission select s.[variablehere]).Single(); 

Est-ce facile à accomplir?

+0

Vous pouvez également regarder [cette question similaire] (http://stackoverflow.com/questions/4214881/using-lambda-expression-to-select-different-fields-from-field-names/4214894# 4214894) –

Répondre

1

Est-il possible de modifier la structure de votre base de données pour que vos colonnes deviennent des lignes? (Faites pivoter votre table?)

Par exemple.

Permissions Table 
----------------- 
Id 
Dashboardname 
Page1 
Page2 
Page3 
... 

et la transformer en

Permissions Table 
----------------- 
Id 
Dashboardname 
Pagename 

Ensuite, vous pouvez utiliser la clause where pour sélectionner la ligne que vous voulez?

0

Je ne pense pas que ce soit possible ou une bonne pratique. Notez que si le nom de la variable est fourni par l'utilisateur, il peut facilement prendre toutes les données souhaitées. Peut-être devriez-vous essayer d'utiliser une énumération et une clause switch()?

+0

Merci pour votre réponse, la variable n'est pas fournie par l'utilisateur - la variable est juste le nom de la page, et il y a une colonne pour chaque page. – Chris

0

Dites la classe qui détient les autorisations est nommé Permission, vous pouvez définir une méthode d'extension:

public static class PermissionExtensions 
{ 
    public static object SelectProperty(this Permission obj, string variable) 
    { 
     return obj.GetType().GetProperty(variable).GetValue(obj, null); 
    } 
} 

Vous pouvez l'utiliser dans votre requête comme ceci:

(from s in dc.Permissions where s.dashboardname == permission select s) 
    .Single().SelectProperty(variable); 

Cela ne sélectionnez la propriété dans la requête, mais récupère l'objet à la place.

1

Je ne suis pas sûr de comprendre complètement votre question, donc c'est peut-être un peu faux. Mais pourriez-vous résoudre votre problème en utilisant the LINQ Dynamic Query Library?

Vous pouvez utiliser la bibliothèque DynamicQuery contre tout fournisseur de données LINQ (y compris LINQ to SQL, LINQ à objets, LINQ to XML, LINQ à entités, LINQ to SharePoint, LINQ à TerraServer, etc.) . Au lieu d'utiliser opérateurs de langue ou typées lambda méthodes d'extension pour construire vos requêtes LINQ, la bibliothèque requête dynamique vous fournit chaîne à base méthodes d'extension que vous pouvez passer toute expression de chaîne en.

Voir le lien ci-dessus pour des exemples et des téléchargements.

0

Une autre réponse qui est venu dans mon esprit est de créer la table avec des paires clé-valeur à savoir

  • tableau de bord
  • clé
  • valeur

où la clé primaire est (dashboard, key).

Questions connexes