2017-05-10 4 views
0

Ich habe eine Tabelle in meinen Entitäten mit 370 Spalten! Außerdem habe ich ein String-Array, das vor der Laufzeit nicht bekannt ist (kommt von einer Website).Zeige nur Spalten aus einem String-Array

z.B .:

string [] columns = {"column1", "column2", "column3"} 

Wie kann ich eine Linq zu meinen Einheiten feuern, die mir nur das Ergebnis mit den Spalten geben gibt?

Ich suchte nach Stunden, aber bisher nicht erfolgreich - irgendwelche Vorschläge?

Antwort

0

Dies ist nicht etwas, das Sie mit Linq-to-Entities tun können. Sie müssen die Spalten in Ihrem Code deklarieren können.

Ein besserer Ansatz wäre, die Abfrage in Sql mit den Spaltennamen in Ihrem Array zu erstellen, und verwenden Sie so etwas wie Dapper, um die Ergebnisse Ihren Objekten zuzuordnen.

+0

Das ist nicht wahr. Sie können die Reflektion –

+0

verwenden und wie kann ich Reflexion verwenden - haben Sie ein Beispiel? – fahr

+0

Auch wenn es mit Reflektion arbeiten würde, ist dies ein typischer Anwendungsfall, der * nicht * für LINQ to Entities geeignet ist. LINQ to Entities ist ideal, wenn Sie Ihre C# -Klassen (Entitäten) haben und Abfragen basierend auf diesen erstellen möchten. Hier sind Oldschool 'DataReader's viel besser geeignet, es klingt wie. – LueTm

0

Sie können ein ExpandoObject in Ihrem Delegaten instanziieren und Reflection verwenden, um die im eingehenden Array angegebenen Spalten abzurufen.

Die folgende:

List<IDictionary<String, Object>> List = Context.Row_Type.Select(delegate(Row_Type Row) { 

     IDictionary<String, Object> Out = new ExpandoObject() as IDictionary<String, Object>; 

     PropertyInfo[] PIs = Row.GetType().GetProperties(); 

     foreach(PropertyInfo PI in PIs) { 
     if(PI.GetIndexParameters().Length == 0) { 
      Out.Add(PI.Name, PI.GetValue(Row)); 
     } 
     } 

     return Out; 

    }).ToList(); 

Wir kommen wieder eine Liste < IDictionary < String, Object >> mit allen Eigenschaften, zurückzukehren, um die gewünschten Spalten nur durch PI.Name unterscheiden:

if(PI.Name == "Desired column"){ // Or Array index 

     // Add to Out: 
     Out.Add(PI.Name, PI.GetValue(Row)) 

    } 
0

Ich schätze, Sie wollen nicht wirklich eine Klasse mit unbekannten Spaltennamen zurückgeben. Würde ein Wörterbuch mit Spaltennamen und Werten für Sie funktionieren? Ihre Abfrage müsste immer noch alle Spalten abrufen, aber Sie können nur diejenigen zurückgeben, die Ihnen wichtig sind.

string [] columns = {"column1", "column2", "column3"} 

var entity = GetEntity(); 
var dictionary = columns.ToDictionary(c => c, c => entity.GetType().GetProperty(c).GetValue(entity)); 

Oder, wenn Sie eine Sammlung haben ...

var entities = GetEntities(); 
var results = entities 
    .Select(e => columns.ToDictionary(c => c, c => e.GetType().GetProperty(c).GetValue(e))); 
+0

Wow - echt cool, das hat meine Probleme gelöst, genau das brauche ich! Vielmals * Daumen hoch * – fahr

Verwandte Themen