【问题标题】:WHERE IN CLAUSE for LINQ to XMLLINQ to XML 的 WHERE 条款
【发布时间】:2010-11-08 15:27:07
【问题描述】:

以下代码应返回过滤器中的所有条形码。但是它似乎只在第一个新记录上执行过滤器。

xml 包含 5 个新记录,其条形码子元素范围为 1-5。如果过滤器包含 1,3 和 4,则返回 1,如果过滤器包含 2,3 和 4,则返回无记录。

当前设置 (rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD") ) 也返回 5 行。我试过看看如果我把它改成单行返回会发生什么(rpa.XMLData.Elements(“NEWFILE”)),但这在给我返回 1 结果是第一次命中时也是一样的,忽略 3 和 4。

有没有办法更改此 LINQ 语句以实际查看所有条形码?

编辑:信息来自测试自动取款机,如果看起来有点奇怪,请见谅。我在 xml 和过滤器上添加了信息。

另外,如果

过滤器包含 1,2,3 它可以工作。 过滤器包含 1,2,4 它会返回 1 和 2 而不是 4。

一旦找不到解决方案,它似乎就崩溃了。

String string2Stream = String.Concat("2", Environment.NewLine, "3", Environment.NewLine, "4", Environment.NewLine, "End");
        Stream reader = new MemoryStream(ASCIIEncoding.Default.GetBytes(string2Stream));
   StreamReader read = new StreamReader( reader );
   var filter = Enumerable.Where(StreamReaderToSeq(read), x => { int temp; return int.TryParse(x, out temp); });


   var query = from p in rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD") 
               where filter.Contains(p.Element("BAR_CODE").Value)
               select new { p.Element("BAR_CODE").Value };   

在 xml 下我删除了很多不应该相关的额外内容。

<?xml version=\"1.0\"?>
<NEWFILE>

<NEWRECORD num=\"1\"><MAILSORT></MAILSORT><BAR_CODE>1</BAR_CODE>
 </NEWRECORD> 

<NEWRECORD num=\"2\"><MAILSORT></MAILSORT><BAR_CODE>2</BAR_CODE>  
</NEWRECORD>

<NEWRECORD num=\"3\"><MAILSORT></MAILSORT><BAR_CODE>3</BAR_CODE>  
</NEWRECORD>

<NEWRECORD num=\"4\"><MAILSORT></MAILSORT><BAR_CODE>4</BAR_CODE>  
</NEWRECORD>

<NEWRECORD num=\"5\"><MAILSORT></MAILSORT><BAR_CODE>5</BAR_CODE>  
</NEWRECORD>

</NEWFILE>

【问题讨论】:

  • 请展示一个简短但完整的示例 - 我们目前看不到 XML 或您如何构建“过滤器”。

标签: c# xml linq linq-to-xml


【解决方案1】:
var filter = new List<string> {"1", "2", "4"};

var query = from p in barcode.Descendants("BAR_CODE")
            where filter.Contains(p.Value)
            select p.Value;

我不确定您将使用您创建的过滤器去哪里,但我认为这是一个非常安全的查询。它很方便,因为即使 BAR_CODE 为空也可以使用。

【讨论】:

  • 看来我的情况确实有流问题。如果我使用您的列表,它会完美运行。也许我需要看看我是否可以将流阅读器添加到列表中。
【解决方案2】:

作为替代答案,This 展示了如何在不包含但保留流的情况下使其工作。

转换成我的代码也可以。

但是,如果您将流替换为 List 或将 Contains 替换为 JOIN,但它工作正常,为什么如果失败,则 Contains 似乎会中断。有人知道答案吗?

      var query = from p in rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD") 
                join f in filter on
                    p.Element("BAR_CODE").Value equals f.ToString()                    
                select p; 

       var projectsMemberWorkedOn =
                    rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD")
                    .Join(filter, p => p.Element("BAR_CODE").Value, f => f.ToString(), 
                        ( p, f ) => new { p, f } ) 
                        .Select(@t => @t.p ); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2017-06-20
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多