使用LINQ更新项目

时间:2013-04-09 01:47:41

标签: asp.net linq

我希望使用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第一个字符串。

谢谢

1 个答案:

答案 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;

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