2013-04-09 118 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