在域上使用谓词搜索 Class

Search using a Predicate on a Domain Class

在 LINQ to Objects 中,可以使用谓词轻松过滤集合的子集,例如如果我的域 class 是 Person,集合是 persons,谓词 Func<Person, bool> filter,它会类似于 persons.Where(filter).ToArray().

与序列化为 XElement:

的人员集合具有相同的功能
XElement[] xFiltered = xPersons.Elements("Person")
                               .Where(xFilter)
                               .ToArray();

其中 xPersons 是包含人物元素的根元素(每个元素都命名为 "Person"),Func<XElement, bool> xFilter 定义在 XElement 上的谓词作为参数类型。

我想知道是否存在在 LINQ 中为 XML 创建 Where 语句的直接可能性,该语句将 Func<Person, bool> 类型的谓词作为参数,而不是 Func<XElement, bool>?为此,需要实现一个转换器将 Func<Person, bool> 转换为 Func<XElement, bool>,但这似乎是一种违反直觉且容易出错的练习。是否可以设想这种真正的转换器(例如基于检查)?或者它只是存在?

您可以在基础 XElement(s) 和 XAttribute(s) 上构建谓词,例如

xPersons.Elements("Person")
        .Where(e => (string)e.Attribute("Name") == "Alex")

要使用 class Person 你需要先反序列化它:

xPersons.Elements("Person")
        .Select(e => CreatePerson(e))
        .Where(p => p.Name == "Alex")

private static Person CreatePerson(XElement element)
{
    // your (de)serialization logic goes here
}

或者您可以在 class:

中编写一个显式转换运算符
xPersons.Elements("Person")
        .Where(e => ((Person)e).Name) == "Alex")

public static explicit operator Person(XElement element)
{
    // your (de)serialization logic goes into your Person class
}