我希望使用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第一个字符串。
谢谢
答案 0 :(得分: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;
这样可以确保在语句结束之前“不要离开表达式树”,这样就可以直接修改引用,而不会丢失给定的数据。