2017-10-16 19 views
-3

J'ai un List<string> où sont stockés le nom de colonne de la table de base de données.sélectionner la colonne de la liste

J'ai besoin de sélectionner uniquement cette colonne (où le nom est stocké dans la liste) d'une requête C# LINQ.

Est-ce possible?

I Try ce code, mais je ne sais pas comment je peux mettre en sélection:

J'essaie ce code

items = items.ToList(); 
      _items.Add(new FieldItem() { FieldName = "field1" }); 
      _items.Add(new FieldItem() { FieldName = "field2" }); 
      _items.Add(new FieldItem() { FieldName = "field3" }); 
      _items.Add(new FieldItem() { FieldName = "field4" }); 

      _db.Table.Where(a => a.TimeStamp > DateTime.Now.AddHours(-1)).Select(....); 

Merci

+1

Oui, c'est possible. Donne-nous ce que tu as essayé maintenant. – Rob

+1

Inclure la liste d'échantillons, la sortie attendue et ce que vous avez essayé –

+1

Veuillez lire [ask] et [edit] votre question pour inclure un [mcve]. –

Répondre

0

Enfin, j'utilise la réflexion. Dans la liste de chaînes sont stockés le nom de la propriété. Obtenez une propriété par son nom, et obtenez sa valeur.

De cette façon, obtenir tous PropertyInfo pour une classe:

PropertyInfo[] propertyInfos; 
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public | 
               BindingFlags.Static); 

Lorsque match nom de la propriété, mettez à jour la valeur de la propriété avec:

property.SetValue(child, parentProperty.GetValue(parent)); 

est-ce pas une solution optimisée, mais fonctionne.

0

Get Dapper via NuGet.

Après cela mis à utiliser dans votre code:

using Dapper; 

Et vous êtes bon pour aller. Tout ce que vous devez faire est maintenant (en utilisant l'exemple que vous avez posté):

using (YourDbContext _db = new YourDbContext()) 
{ 
    return _db.Database.Connection.Query($"SELECT {string.Join(",", _items.Select(if => if.FieldName))} FROM Table WHERE TimeStamp > @TimeStamp;", new { TimeStamp = DateTime.Now.AddDays(-1) }); 
} 

Cette méthode retourneraient IEnumerable qui aurait tous vos champs. Les résultats peuvent être castés dans IDictionary où la clé est le nom de votre colonne et la valeur est la valeur réelle.

Ainsi par exemple, si nous devions obtenir la première ligne dans les résultats avec First(), on peut accéder aux valeurs de champ comme ceci:

var value = ((IDictionary<string, object>)result.First())["column_name"]; 
+0

Merci. C'est très bien. –