Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ更新集合中的一个对象_C#_Linq - Fatal编程技术网

C# 使用LINQ更新集合中的一个对象

C# 使用LINQ更新集合中的一个对象,c#,linq,C#,Linq,我在这个对象中有对象和集合 myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault() = newMyCollection; 不幸的是,这不起作用 如果我改变单个元素,那么工作。例如: myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault().Id = newMyCollection.Id; 如何更新所有对象?谢谢你的帮助 我可以这样做: myObje

我在这个对象中有对象和集合

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);
myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault(a => { a.Id = newMyCollection.Id; return true; });

但是:如果MyCollection的my
对象是第一个,那么我的新对象是最后一个。

您可以查询一个列表并迭代:

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中是不可能的(LINQ设计用于查询,而不是更新对象)

要使用列表执行此操作,请使用旧式
for
-循环:

for(int i = 0; i < myList.Count; i++)
{
    if(myList[i].Id == Id) 
    {
        myList[i] = newElement;
        break;
    }
}

要仅更改第一个索引,可以执行以下操作:

myObject.myCollection.Remove(objectOfMyCollection);
myObject.MyCollection.Add(myNewCollection);
myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault(a => { a.Id = newMyCollection.Id; return true; });
用通俗易懂的英语说:

-从myCollection获取项目Id等于Id的项目

-从所选值中获取FirstItem并将其Id设置为新的

-不要检查其余部分

或者更简单一些:

myObject.myCollection.FirstOrDefault(a => { if(a.Id == Id) { a.Id = newMyCollection.Id; return true; } return false; });

如果要复制SQL
updatewithjoin
并更新一个或多个对象,可以按如下所示使用LINQ,这次使用的是
CollectionBase
-派生对象。但是您可以使用
列表
,等等

(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,并且不会改变集合。是的,它会创建仅包含原始集合项引用的轻型对象。

Linq中的Q用于“查询”而不是“更新”。是的,但我需要响应:)我可以使用“删除”和“添加”,但如果元素在中,则此更改索引为Firstly,例如,您所说的响应是什么意思?数据库中的某些元素可能会更改。如果我再次更改数据库,我不必更改此代码。我不完全理解你的意思,你能编辑你的问题并添加一个示例场景吗?看。对象是数据库中的实体。myCollection有许多元素:例如:名称、url、标题。有时可能需要添加另一个元素fe:description。然后我必须更改我的循环和下一个元素obj.Description=newMyCollection.Description.Awesome!谢谢。我的myObject仍然是旧数据。如果(索引!=-1)myObject.myCollection[index]=newCustomListItem;如果我必须添加.Name=newCustomListItem.Name,那么就开始工作。有什么想法吗?你是在使用linq到对象还是linq到实体(实体框架)?此代码仅适用于linq to对象(确切地说:)。好的,怎么做?你可以通过使用Detach和attachentity来实现实体框架