2013-04-09 62 views
0

我希望使用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

您是否尝试删除最外面的圆括号?并多解释一下... – 2013-04-09 03:04:48

+0

尝试删除您的第一个“FirstOrDefault”子句。 – 2013-04-09 05:05:32

+0

是卡莫罗,但它仍然不起作用... – 2013-04-09 05:19:39

回答

0

代码的组成部分,它可以防止工作这个片段是Select(/*...*/)方法。这将创建一个新的引用,并将您从表达式树中执行回到对象上下文。

你必须把它写这样的:

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

这不是很beau​​tyfull,但要实现自己的目标的唯一途径。 更多漂亮的代码中使用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; 

这种方式可以确保,你“不留下表达式树”,直到你的语句的结束,这样你就可以直接修改您的参考,而不会丢失给定的数据。

+0

尝试了上面的代码,但我得到了一个错误。 'y'在当前上下文中不存在。这部分代码“y.First()。DocSpecs.First()” – 2013-04-09 06:14:06

+0

试过一次以及 jt.SummarySpecs 。其中(y => y.First()。DocSpecs.First()。DelItemID = docSpc.DelItemID && y.First()。DocSpecs.First()。ItemCode == docSpc.ItemCode) .First()。DocSpecs.First()。FinishingOptionsDesc.First()= option; 但出现错误。 y.first()“不包含定义...” – 2013-04-09 06:16:48

+0

已编辑 - 再试一次 – 2013-04-09 06:28:47