在域类上使用谓词进行搜索



在LINQ to Objects中,可以很容易地使用谓词过滤集合的子集,例如,如果我的领域类是Person,集合是persons,谓词Func<Person, bool> filter,它将是类似persons.Where(filter).ToArray()的东西。

与序列化为XElement的人员集合相同的函数:

XElement[] xFiltered = xPersons.Elements("Person")
                               .Where(xFilter)
                               .ToArray();

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

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

您可以在底层的XElement和XAttribute上构建谓词,例如

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

要使用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
}

或者您可以在类中编写显式强制转换操作符:

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
}

相关内容

  • 没有找到相关文章