C# 使用LINQ到XML的条件查询
Im使用LINQtoXML删除标记并将其插入XML文档。我经常遇到的一种情况是,我对插入特定标记的位置有偏好,但这种偏好并不总是能够满足。例如,在这里,我更愿意将其插入具有相同日历代码的最后一个元素之后:C# 使用LINQ到XML的条件查询,c#,linq-to-xml,C#,Linq To Xml,Im使用LINQtoXML删除标记并将其插入XML文档。我经常遇到的一种情况是,我对插入特定标记的位置有偏好,但这种偏好并不总是能够满足。例如,在这里,我更愿意将其插入具有相同日历代码的最后一个元素之后: elements = from e in calendarDocument.Descendants("ExceptionalSessions") where e.Element("CalendarCode") == calendarCode select e; elements.Last()
elements = from e in calendarDocument.Descendants("ExceptionalSessions") where e.Element("CalendarCode") == calendarCode select e;
elements.Last().AddAfterSelf(sessionElement);
但是,有时要插入的元素是该文档中具有该日历代码的第一个元素,因此附加条件:
where e.Element("CalendarCode") == calendarCode
将创建一个空结果集。在这种情况下,我希望使用一个没有附加条件的查询。这只是一次,在插入一个带有日历代码的元素之后,我希望在第一个元素之后插入下一个带有相同日历代码的元素。。。在这种情况下,我希望使用带有附加条件的查询
我试过几种方法来解决这个问题,但它们看起来都很粗糙,可能效率很低,我忍不住认为有更好的方法
谁能告诉我他们是否遇到过这种情况 一种选择是在添加之前评估条件并确定目标。为清晰起见,使用单独的方法,可能类似于以下内容(未测试): 或者一个稍微不同的实现:
private XElement GetCalendarTargetNode(XElement source, XElement calendarCode)
{
var exceptionalSessions = source.Descendants("ExceptionalSessions");
return exceptionalSessions.Where(e => e.Element("CalendarCode") == calendarCode).DefaultIfEmpty(exceptionalSessions.Last()).Last();
}
并使用它:
var target = GetCalendarTargetNode(calendarDocument, calendarCode);
target.AddAfterSelf(sessionElement);
编辑:
或不使用额外方法的简化版本:
var exceptionalSessions = calendarDocument.Descendants("ExceptionalSessions");
var target = exceptionalSessions.Where(e => e.Element("CalendarCode") == calendarCode)
.DefaultIfEmpty(exceptionalSessions.Last());
target.Last().AddAfterSelf(sessionElement);
你是说var target=exceptionalSessions.Where(e=>e.Element(“CalendarCode”)==CalendarCode.DefaultIfEmpty(exceptionalSessions);没有最后一个()。不过,谢谢你,这似乎适合我的需要。这仍然被认为是一个没有“from”的linq查询。。。“select”?嗯,DefaultIfEmpty()实际上接受了当为空时应该返回的默认元素,我只是假设它是exceptionalSessions中的最后一个元素,因为exceptionalSessions是IEnumerable)。是的,它仍然是Linq,方法链接只是同一事物的替代语法。嗯,DefaultIfEmpty有点让我困惑。您传入一个元素并返回一个集合?我能理解这一点的唯一方法是它只返回原始结果集。所以调用DefaultIfEmpty()后,exceptionalSessions和target将是相同的结果集(如果没有匹配的日历代码元素)???或者target simple是否有一个元素?确切地说,DefaultIfEmpty()将为您执行检查,如果传入的枚举没有任何元素,它将生成您提供的默认值,但仍然返回一个仅包含该默认元素的IEnumerable。
var exceptionalSessions = calendarDocument.Descendants("ExceptionalSessions");
var target = exceptionalSessions.Where(e => e.Element("CalendarCode") == calendarCode)
.DefaultIfEmpty(exceptionalSessions.Last());
target.Last().AddAfterSelf(sessionElement);