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 に答える