Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ到XML的条件查询_C#_Linq To Xml - Fatal编程技术网

C# 使用LINQ到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()

Im使用LINQtoXML删除标记并将其插入XML文档。我经常遇到的一种情况是,我对插入特定标记的位置有偏好,但这种偏好并不总是能够满足。例如,在这里,我更愿意将其插入具有相同日历代码的最后一个元素之后:

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);