Linq查询where子句返回null

Posted

技术标签:

【中文标题】Linq查询where子句返回null【英文标题】:Linq query where clause returning null 【发布时间】:2013-07-31 17:32:04 【问题描述】:

这是我试图获取标签元素 Posted_Status 的 XML 文件,其中 Posted_Status 已准备就绪

<?xml version="1.0" encoding="utf-8"?>
<Server>
      <Network> <---Network is the parent element
        <Posted_Status id="10">Ready</Posted_Status>
        <Timed_On id="10">7/28/2013 9:32:10 AM</Timed_On>
        <Timed_Off id="10">8/28/2013 9:32:10 AM</Timed_Off>
      </Network>
</Server>

我遇到了 linq 查询返回 null 的问题。我正在尝试查询 XML 元素。元素名称为Posted_Status。标记值为“就绪”。我正在尝试获取标签Posted_Status,其中 Posted_Status 等于“Ready”。

 // Query's the tag where the tag equals Ready
IEnumerable<XElement> expiration =
            from exp in main.Elements("Posted_Status")
            where (string)exp.Element("Posted_Status").Value == "Ready"
            select exp;

这会执行或调用查询,并显示来自Posted_Status XML 标记的所有值,其中标记值等于“Ready”。

 foreach (string exp in expiration)
 
     for (int i = 0; i < IntializedPostStat.Count(); i++)
     
         IntializedPostStat[i] = exp.ToString();
         lstIntializations.Items.Add("[Posted_Status]......" 
             + IntializedPostStat[i].ToString());
         break;
     
 

【问题讨论】:

【参考方案1】:

您不需要在where 子句中转换为字符串,也需要将其与 Value like 进行比较

where exp.Element("Posted_Status").Value == "Ready"

试试:

var expiration =
       from exp in main.Elements("Network")
       where exp.Element("Posted_Status").Value.Equals("Ready", StringComparison.CurrentCulture)
       select
       new
       
           Timed_On = exp.Element("Timed_On").Value,
           Timed_Off = exp.Element("Timed_Off").Value,
       ;

对于输出:

foreach (var item in expiration)

    Console.WriteLine("Timed_On: 0 \r\nTimed_Off: 1", item.Timed_On, item.Timed_Off );

(最好将值解析为属性DateTime 对象)

【讨论】:

由于某种原因它返回 null 仍然可能是我调用或执行查询的方式或其他方式 @Habib 他不是缺少 ToList() 来获得结果吗? @EhsanUllah,不是真的,在使用 foreach 循环进行迭代时,它会执行(迭代)查询。 XElement 定义强制转换运算符以适当的格式返回Value;除了不区分大小写之外,您和 OP 所做的事情并没有真正的区别。 @Habib 现在这对我来说是新的。【参考方案2】:

您的fromwhere 都读取Element("Posted_Status")

根据更新的问题进行编辑,应该是这样的:

XElement main = XDocument.Load(fi.FullName).Element("Server");
var expiration = from exp in main.Elements("Network")
 where exp.Element("Posted_Status").Value == "Ready"
 select exp;

您必须先阅读根元素。然后遍历所有“网络”并检查“Posted_Status”值

这将返回所有符合条件的“网络”元素

【讨论】:

我会发布 main 主要定义如下 XElement main = XElement.Load(fi.FullName); 它仍然返回 null,它需要从该元素中获取准备好的值,但我希望查询在接收它之前验证该值。 你能发布整个 XML 文件吗? 我更改了查询,它可能会让您更好地了解我想要做什么 只有在 Posted_Status 的值为 Ready 时,才提供显示 Posted_Status 所需的网络值

以上是关于Linq查询where子句返回null的主要内容,如果未能解决你的问题,请参考以下文章

带有 lambda 表达式的 LINQ where 子句具有 OR 子句和返回不完整结果的空值

linq to sql select和where的区别

使用过滤器对象的 Linq where 子句

具有 LINQ 的实体框架在 WHERE 子句中使用 CONTAINS 非常慢且具有大整数列表

选择带有“is null”子句的查询和子选择/左连接不返回结果

有效的 WHERE 子句检查最小值和 NULL 之间的值