2017-05-17 3 views
0

Ich habe eine Abfrage, die eine Tabelle mit 4 Spalten zurückgibt:Filter Spalte IQueryable C#

ItemName | Land A | Land B | Land C |

Ich habe einige Genehmigungsprozesse in meiner App und einige Benutzer sollten nur bestimmte Länderspalten sehen.

Zum Beispiel Benutzer mit Anspruch Land = A sollte nur sehen:

ItemName | Land A |

Gibt es eine Möglichkeit, die Spalten basierend auf dem Namen der Spalte zu filtern?

IQueryable<AllCountries> ResultsVM = _context.AllCountries; 
      var country = IdentityExtensions.GetCountryId(User);    

      if (country != null) 
      { 
       Type elementType = ResultsVM.ElementType; 
       foreach (PropertyInfo pi in elementType.GetProperties()) 
       { 

         if (country==pi.Name) 
         { 
          ResultsVM= _context.AllCountries 
              .Select(t => new AllCountries 
            {           
             ItemName=t.ItemName, 
             ?? only the column which matches the country 
            }); 
         } 

       } 

      }  

Bisher weiß ich, wenn eine Spalte meiner IQueryable in das Land des Benutzers entspricht, aber ich weiß nicht, in meinen Sie fest, wie es zu zeigen, und die andere entfernen ...

aktualisieren

Mein Ansichtsmodell ResultsVM die die IQueryable speichert und wird meiner Ansicht nach in meinem MVC Web-Projekt verwendet werden, wird als Liste definiert:

public class AllCountries 
    {  
     [DisplayName("Item")] 
     public string ItemName { get; set; } 
     public int? Country1 { get; set; } 
     public int? Country2 { get; set; } 
     public int? Country3 { get; set; }   
    } 

Danke

Sylvain

Antwort

0

In Anbetracht der Name Präfix der Spalten ist Land und die Bedingung, auf dem Sie diese Spalte ist Suffix dieser Spalte für Ex auswählen möchten:

Country + '1' 
Country + '2' 
Country + '3' 
Country + '4' 

Dann können Sie erstellen eine dynamische auswählen, die in LINQ-Abfrage wie folgt aus:

public class Country 
     { 
      public string Condition { get; set; } 
      public string Country1 { get; set; } 
      public string Country2 { get; set; } 
      public string Country3 { get; set; } 
     } 

public void GetData() 
     { 
      List<Country> liCountry = new List<Country>(); 
      liCountry.Add(new Country { Condition = "1", Country1 = "2", Country2 = "3", Country3 = "4" }); 
      liCountry.Add(new Country { Condition = "2", Country1 = "20", Country2 = "30", Country3 = "40" }); 
      liCountry.Add(new Country { Condition = "3", Country1 = "21", Country2 = "31", Country3 = "41" }); 
      string temp = "2"; 
      var liResult = liCountry.Where(w => w.Condition == temp).Select(s => new {result = s.GetType().GetProperty("Country" + temp).GetValue(s, null) }).ToList(); 

     } 

in der select-Anweisung I Reflection verwendet haben, die c zu erhalten Spaltenname dynamisch.

+0

Vielen Dank. Wie wählen Sie aus, um ein Ergebnis zurückzugeben, das den korrekten Spaltennamen (z. B. country2 in Ihrem Beispiel) anstelle des generischen Spaltennamens "result" enthält? Es ist mir wichtig, um das Mapping aus meiner Sicht zu machen. – sylvain77

+0

@ sylvain77 habe nicht bekommen, was du fragst, Könntest du bitte ausarbeiten? –

+0

Sicher. Ich habe meine Frage aktualisiert. Ich brauche meine IList resultsVM basierend auf der Klasse in meiner Frage definiert. In Ihrem Beispiel wäre es liResult mit "country2" als Titel meiner Spalte in meiner Liste und nicht "result", wie es in Ihrem Beispiel gezeigt wird. Ich muss die Benennung konsistent halten, um sie nach meiner Ansicht zu verwenden. – sylvain77