【问题标题】:Updating an item using LINQ, not working使用 LINQ 更新项目,不起作用
【发布时间】:2013-04-09 06:44:24
【问题描述】:

美好的一天!

我有如下查询:

jt.SummarySpecs.Where(
x => true
)
.FirstOrDefault()
.DocSpecs
.Where(
    x => x.DocID == x.DocID
)
.FirstOrDefault()
.FinishingOptionsDesc[0] = option;

但是当代码被执行时,finishOptionsDesc[0] 的值没有更新...

上面的查询有什么问题?


类属性:

"SummarySpecs.cs"
    public DocSpec[] DocSpecs { get; set; }

"DocSpecs.cs"
    public string[] FinishingOptionsDesc { get; set; }

我唯一关心的是更新 FinishingOptionDesc 第一个字符串。

谢谢

【问题讨论】:

  • 你想在where子句中做什么,“x.DocSpecs == x.DocSpecs”,因为两者都是一样的......
  • 我打算这样做,以便我可以检查“DocSpecs”对象下的数据。抱歉,我还是 LINQ 的新手...
  • 看,不是在两边都给出相同的值,而是给出一些静态值,如 1、2,看看它是否更新......Where(x=> x.DocID == 1 )
  • .Where( x => true ),尝试了这个,但值没有更新。
  • 您能否更新您的问题并向我展示您的表 SummarySpecs 和 DocSpecs 中的数据。

标签: linq


【解决方案1】:

该错误意味着某些内容为空。您在一个语句中有 4 个未经检查的地方可能有一个空返回值。如果这些集合为空,则对 FirstOrDefault 的任何调用都可能返回 null。或者 DocSpecs 在返回的对象上可能为 null,或者 FinishingOptionsDesc 可能为 null。

理想情况下,您应该稍微分解一下这个语句并插入空检查。你可以说你知道这些点都不应该永远为空。如果是这种情况,允许发生异常可能是有效的,但可以说,仍然值得拆分语句以更好地报告异常发生的位置。

【讨论】:

    【解决方案2】:

    试试这样的.. 更新

    if(jt.SummarySpecs.Select(a=>a.DocSpecs).Any())
    {
        var docSpecs = jt.SummarySpecs.Select(a => a.DocSpecs)
        docSpecs.FinishingOptionsDesc[0] = option;
    }
    

    【讨论】:

    • 它不会工作。如果(jt.SummarySpecs.DocSpecs.Any())。在“SummarySpecs”之后,DocSpecs 没有选项。可能的选项是“where、select、any 等等……”
    • 您有 DocSpecs 吗?如果没有,请创建几个 DocSpecs 和 SummarySpecs 然后尝试...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多