在域上使用谓词搜索 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
}
在 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
}