0

我希望使用 LINQ 更新项目。我试过这个查询。

string option = "new value here";

(jt.SummarySpecs.Select(x => x.DocSpecs)
    .FirstOrDefault()
    .Where(
        y => y.DelItemID == docSpc.DelItemID &&
        y.ItemCode == docSpc.ItemCode
    )
    .FirstOrDefault().FinishingOptionsDesc[0]
) = option;

我希望更新“FinishingOptionDesc”的值,这是一个字符串值的集合,但我只希望更新第一个。

但是上面的代码不起作用。

类属性:

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

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

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

谢谢

4

1 回答 1

0

阻止此代码段工作的代码部分是Select(/*...*/)方法。这会创建一个新的引用,并将执行从表达式树带回对象上下文。

你必须这样写:

jt.SummarySpecs
.Where(y => 
    y.DocSpecs.First().DelItemID = docSpc.DelItemID
    && y.DocSpecs.First().ItemCode == docSpc.ItemCode)
.First().DocSpecs.First().FinishingOptionsDesc.First() = option;

它不是很漂亮,但实现目标的唯一方法。要获得更漂亮的代码,请使用 QES:

(from item in jt.SummarySpecs
let searchItem = item.DocSpecs.First()
where searchItem.DelItemID = docSpc.DelItemID
&& searchItem.ItemCode = docSpc.ItemCode
select item)
.First().DocSpecs.First().FinishinOptionsDesc.First() = option;

这种方式可确保您在语句结束之前“不离开表达式树”,因此您可以直接修改您的引用,而不会丢失给定的数据。

于 2013-04-09T05:58:45.130 回答