2016-11-15 5 views
1

Ich habe eine Liste von EigenschaftenFilter in linQ C# mit dynamischen Eigenschaften

string[] strings = 
{ 
    "State", "Name","Location" 
}; 

Sie sind alle in Test-Objekt mit Typ String, ich brauche sie eine Schleife werfen ersten und filtern die Daten, wenn die Eigenschaft gleich „OK "

Hier ist mein Code-Schnipsel

for (int x=0;x<strings.Length;x++) 
{ 
    // PropertyDescriptor prop = TypeDescriptor.GetProperties(typeof(Test)).Find(strings[x],true);            

    var miss = _unityOfWork.TestRepository.Get(i => 
        i.GetType().GetProperty(strings[x]).Equals("OK")) 
        .Select().toList() 

dieser Code die folgende Ausnahme zurückgibt:

"LINQ to Entities erkennt die Methode 'System.Reflection.PropertyInfo GetRuntimeProperty (System.Type, System.String)' nicht, und diese Methode kann nicht in einen Speicherausdruck übersetzt werden."

Ich brauche die Liste mit dem Eigenschaftsnamen bilden das Array

+0

Was genau Ihr TestRepository ist? Wie wird es umgesetzt? –

+0

Ich denke, Sie wollten sagen, wenn die Eigenschaft ** Wert ** gleich "OK" _, oder? – wdosanjos

+0

@EduardMalakhov wird von GenericRepository vererbt – abdoutelb

Antwort

1

Hier ist, wie ich es wahrscheinlich tun würde ... schlicht und einfach, ohne Reflexion, und der Schalter hat zwei Funktionen: (1) zum Schutz vor unbekannten Feldern, (2) um die richtige Bedingung für jeden Fall anzuwenden.

var strings = new[] { "State", "Name", "Location" }; 

var result = _unityOfWork.TestRepository.GetAll().AsQueryable(); 
// you may need to tweak the above before it works 

foreach (var field in strings) 
{ 
    switch (field) 
    { 
     case "State": 
      result = result.Where(x => x.State == "OK"); 
      break; 
     case "Name": 
      result = result.Where(x => x.Name == "OK"); 
      break; 
     case "Location": 
      result = result.Where(x => x.Location == "OK"); 
      break; 
    } 
} 

return result; // if needed, add .ToList() or .ToArray() 
+0

danke es geholfen – abdoutelb

-1

Sie filtern dies tun könnte (nicht sicher über die genaue Syntax, aber die Idee):

var miss = _unityOfWork.TestRepository.Get() 

        .Where(i => i.GetType().GetProperty(strings[x]).Equals("OK")) 
        .toList() 

EDIT: Die richtige Option wäre so etwas wie

var miss = _unityOfWork.TestRepository 
       .ToList() 
       .Where(i => i.GetType().GetProperty(strings[x]).Equals("OK")) 
       .toList() 
+0

Danke ...aber es ist immer noch das gleiche – abdoutelb

+0

@AbdouTelb Ich entschuldige, ich habe den Anruf ToList in der Mitte verloren. –

0

Y ou könnte möglicherweise Folgendes tun:

public string ValidateProperty<T>(T parameter) 
{ 
    var properties = typeof(...).GetProperties(); 
    foreach(var property in properties) 
      if(property == parameter) 
       return "OK"; 

    return "FAIL"; 
} 

var content = collection.Get().Where(property => ValidateProperty(property.Name.Value) == "OK" && ValidateProperty(property.State.Value) == "OK"); 

hatte keine Zeit, um die Syntax zu überprüfen, aber dies sollte Ihnen erlauben, alle zu vergleichen. Die Falle, ist es wird ein PropertyInfo Array bei jedem Anruf generieren. Eine Idee oder ein anderer Ansatz, nicht sicher, wie machbar es für Ihre Implementierung sein wird.

0

Da die OP angegeben, dass die Eigenschaften sind immer die gleichen, bitte versuchen Sie dies:

var miss = _unitOfWork.TestRepository 
         .Where(m => m.State == "OK" || m.Name == "OK" || m.Location == "OK"); 
+0

Ich brauche eine Zeile pro Test pro gültige Eigenschaft – abdoutelb

+0

Geändert '&&' durch '||', um Ihre Testanforderung zu adressieren. – wdosanjos

+0

hat immer noch Probleme, wenn die Projektion nicht genau dorthin gelangen kann, wo die Bedingung auftritt – abdoutelb

Verwandte Themen