2017-12-05 9 views
0

Ich muss Filterfunktion mit Ausdrucksparameter implementieren. So kann ich gefilterte Abfrage nicht auf Entität anwenden.Anwenden von Ausdruck Funktionen

Entity:

[XmlRoot(ElementName = "Zip")] 
public class Zip 
{ 
    [XmlAttribute(AttributeName = "code")] 
    public string Code { get; set; } 
} 

[XmlRoot(ElementName = "District")] 
public class District 
{ 
    [XmlElement(ElementName = "Zip")] 
    public List<Zip> Zip { get; set; } 
    [XmlAttribute(AttributeName = "name")] 
    public string Name { get; set; } 
} 

[XmlRoot(ElementName = "City")] 
public class City 
{ 
    [XmlElement(ElementName = "District")] 
    public List<District> District { get; set; } 
    [XmlAttribute(AttributeName = "name")] 
    public string Name { get; set; } 
    [XmlAttribute(AttributeName = "code")] 
    public string Code { get; set; } 
} 

[XmlRoot(ElementName = "AddressInfo")] 
public class AddressInfo 
{ 
    [XmlElement(ElementName = "City")] 
    public List<City> City { get; set; } 
} 

Testfall gefiltert nach Stadtnamen "Berlin". Wie kann Prädikat mit Funktion angewendet werden?

public IConverter<T> Filter(Expression<Func<T, bool>> predicate) 
{ 
    // ??? 
    return this; 
} 

Antwort

0

Ich nehme an, Sie müssen eine Sammlung mit einem gegebenen Prädikat filtern.

Sie können einen Filter-Extension-Methode definieren, die ein Prädikat als Argument (oder verlassen sich einfach auf dem bereits bestehenden collection.Where Extension-Methode)

public static class Extensions 
{ 
    public static IEnumerable<T> Filter<T>(this IEnumerable<T> collection, Func<T, bool> predicate) 
    { 
     return collection.Where(predicate); 
    } 
} 

Prädikate definieren, basierend auf Ihren Bedürfnissen

// Filter by city Berlin 
Func<City, bool> berlin = city => city.Name == "Berlin"; 

// Filter by district Spandau 
Func<City, bool> spandau = city => city.Districts.Any(d => d.Name == "Spandau"); 

// Filter by zip 10115 
Func<City, bool> zipcode = city => 
{ 
    var predicate = from district in city.Districts 
        from zip in district.Zips 
        where zip.Code == "10115" 
        select zip; 

    return predicate.Any(); 
}; 

Filter auf die gegebenen Daten Prädikat

var query = from address in addresses 
      from city in address.Cities.Filter(berlin) 
      select city; 

enter image description here

Verwandte Themen