[英]Update one object in collection using LINQ
我在這個對象中有對象和集合。
myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault() = newMyCollection;
不幸的是,這沒有用
如果我更改單個元素,則可以工作。 例如:
myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault().Id = newMyCollection.Id;
如何更新所有對象? 謝謝你的幫助
我可以做這樣的事情:
myObject.myCollection.Remove(objectOfMyCollection);
myObject.MyCollection.Add(myNewCollection);
但是:如果我的objectOfMyCollection
首先,那么我的新對象將是最后一個。
您可以查詢列表並對其進行迭代:
foreach (var obj in myObject.myCollection.Where(a => a.Id == Id).ToList()) {
obj.Id = newMyCollection.Id;
}
嘗試這個
var customListItem2 = myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault();
var index = myObject.myCollection.IndexOf(customListItem2);
if(index != -1)
myObject.myCollection[index] = newCustomListItem;
您將必須替換列表中的基礎引用,而這是LINQ不可能的(這是為查詢而不是更新對象而設計的)。
要使用列表執行此操作,請for
-loop中使用舊式:
for(int i = 0; i < myList.Count; i++)
{
if(myList[i].Id == Id)
{
myList[i] = newElement;
break;
}
}
使用for
-而不是一個foreach
,因為您在使用列表中的后者,這是不可能再參考實例需要在這里。
另一種方法是創建列表的臨時副本,在列表中獲取匹配的元素及其索引,然后替換原始列表中該索引處的元素:
var tmp = myList;
foreach(var elem in tmp)
{
if(elem.Id == Id)
{
var index = myList.IndexOf(x => x.Id == Id);
myList[index] = newElement;
break;
}
}
要僅更改第一個索引,您可以執行以下操作:
myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault(a => { a.Id = newMyCollection.Id; return true; });
用簡單的英語可以做到:
- From myCollection get items Where item's Id is equal to Id
- From selected values get FirstItem and set it's Id to the new one
- Do not check the rest
甚至更簡單:
myObject.myCollection.FirstOrDefault(a => { if(a.Id == Id) { a.Id = newMyCollection.Id; return true; } return false; });
如果要UPDATE with JOIN
復制SQL UPDATE with JOIN
並更新一個或多個對象,則可以使用下面的LINQ,這次使用CollectionBase
派生的對象。 但是您可以使用List<T>
等
(from Type1 o1 in collection1
join Type2 o2 in collection2 on o1.Id equals o2.RelatedId
select new { O1 = o1, O2 = o2 }).
Count(item => (item.O1.SomeProperty = item.O2.SomeOtherProperty) == null);
有點駭人聽聞,但它的行為類似於SQL,並且不會使集合發生變異。 是的,它會創建僅包含原始收集項目參考的輕型對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.