2016-04-18 9 views
3

Ich habe eine Liste mit Daten um mehr als 30 Eigenschaften für jedes Listenelement und ich versuche, eine Linq-Abfrage zu schreiben, die Operationen auf der Liste ausführen wird.So machen Sie Select-Anweisung Dynamisch? Linq

Meine Eigenschaften pro sagen für jedes Listenelement, sie sind Name, Ort, Alter etc so was ist, wenn ich meine Liste filtern möchten, um bestimmte Spalten Daten wie nur Name oder Ort oder eine beliebige Kombination auszuwählen.

statische Abfrage:

(from data in myList select new {DName = data.Name,myPlace= data.Place}).ToList(); 

so suche ich select Teil dynamisch zu machen. Alle meine gewünschten Spalten info i in einem Array gespeichert werden

Beispiel:

var arr = new [] {'Name','Age'} // this will change 

Irgendwelche Ideen, wie meine Array von Spalten in Linq verwenden, um Daten zu filtern.

+0

Wo wird es geändert werden, und wer oder was? –

+0

@DaveWilliams ist ein echtes Szenario, es ist Grid-Spalte Anpassung. So kann Benutzer die erforderlichen Spalten für das nächste Mal laden und er speichert es in db, so bekomme ich die gespeicherte Liste und ich möchte filtern die Liste enthält alle Spalten Daten, so kann ich einen Export von nur benutzerdefinierten Spalten tun. –

+0

In welchem ​​Fall wäre es nicht besser, die Anzeige dynamisch zu ändern? Zum Beispiel mit WPF wäre das [AutoGeneratingColumns] (https://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.autogeneatingcolumn (v = vs.110) .aspx) -Ereignis. –

Antwort

1

Sie können Dynamic LINQ ausprobieren, ein Konzept, das von Microsoft in einem ihrer Beispiele eingeführt wurde. Es gibt mehrere Nuget-Pakete (z. B. https://www.nuget.org/packages/System.Linq.Dynamic/). Im Grunde haben Sie anstelle von stark typisierten Ausdrücken Strings. Sie können einen Beitrag darüber hier finden: https://weblogs.asp.net/ricardoperes/dynamic-linq.

+0

yeah ich bin durch diese besondere eine erwähnt, aber immer noch gehofft, es gibt etwas, was wir ohne zusätzliches Paket tun können –

+0

Hast du meinen anderen Beitrag gesehen, https://weblogs.asp.net/ricardoperes/dynamic-linq-in-an- Montage in der Nähe? –

1

Sie können ExpandoObject verwenden und Ihr Zeichenfolgenarray als seine Eigenschaften hinzufügen.
Sie sollten neu ExpandoObject deklarieren und es in IDictionary<String,Object> konvertieren, dann erhalten Sie jede Eigenschaft Ihrer Datenzeile mit Reflexion und nach Eigenschaftsname aus String-Array. Fügen Sie schließlich dem gewichteten Wörterbuch den Namen der Eigenschaft und ihren Wert hinzu.

Beispiel:

//initialize DataSource 
var myList = Enumerable.Range(0, 10).Select (i=> new { Name = "abc", Place = "def" }).ToList(); 

//initialize array of properties 
var properties = new string[] { "Name", "Place" }; 
var result = myList.Select(data =>  
{ 
    dynamic r = new System.Dynamic.ExpandoObject(); 
    properties.AsParallel().ForAll( 
     p => (r as IDictionary<string, object>).Add(p, 
     data.GetType().GetProperty(p).GetValue(data, null))); 
    return r; 
}); 
Console.WriteLine(result.Last().Place); //def 
+0

lassen Sie mich einen Schuss geben –