有没有一种方法可以使用 LINQ 更新通用列表而不是删除列表的成员并将其添加回来?

Is there a way to update a generic list using LINQ rather than deleting a member of the list and adding it back?

LINQ 是否允许 Upsert 类型的操作或更新现有记录?我有以下代码从列表中获取 "record",更新它的某些部分,然后删除原始的并添加回这个更新的:

. . .
Student student = LINQ2ObjectsCode.GetStudentForId(ah.StudentID_FK);
// Update several members of the Students list...
student.WeekOfLastAssignment = _currentWeek;
int nextTalkTypeId = AYttFMConstsAndUtils.GetNextTalkIDForBrothers(ah.StudentID_FK, 1); 
student.RecommendedNextTalkTypeID = nextTalkTypeId;
student.NextCounselPoint = LINQ2ObjectsCode.GetNextCounselPoint(nextTalkTypeId, student.NextCounselPoint);
// ...then update that record by first deleting the old one...
AYttFMConstsAndUtils.StudentsList.RemoveAll(x => x.StudentID == ah.StudentID_FK);
// ...and then adding back the updated one:
AYttFMConstsAndUtils.StudentsList.Add(student);
. . .

public static Student GetStudentForId(int _studentId)
{
    return AYttFMConstsAndUtils.StudentsList.SingleOrDefault(
        i => i.StudentID.Equals(_studentId));
}

...但我不知道这是否是首选方法。有没有办法更新现有记录,而不是销毁它并用新版本替换它?我想有,但我不知道有多复杂,也不知道它是真的更好还是只是不同。我将有几个类似的方法,但我不想多次执行 "wrong" 事情。

注意:数据并非来自数据库;相反,它存储在 json 个文件中。

您无需再次删除和添加实体。

一般情况下,如果列表是本地列表,则对象是通过引用。所以你可以查询一个对象,并在适当的地方修改它的属性,并且你已经更新了真实对象的字段。

对于 LINQ2SQL 或 EF 或 ORM 实体,每当您获取记录时,上下文管理器都会跟踪实体的状态。您可以修改其属性,并在上下文中执行 SubmitChanges() 或 SaveChanges(),记录将自动更新。

请注意,您需要在上下文范围内才能进行提取、修改某些属性并进行保存更改。如果您在获取实体后丢失了上下文,您仍然可以轻松修改实体,只是您需要再次附加对象并保存上下文。

如果您需要执行此操作的 LINQ2SQL 或 EF 实例,请告诉我。 (附加实体)

例如

using (var context = new YourDbContext())
{
 Student student = LINQ2ObjectsCode.GetStudentForId(context, ah.StudentID_FK);
 // Update several members of the Students list...
 student.WeekOfLastAssignment = _currentWeek;
 int nextTalkTypeId =  
 AYttFMConstsAndUtils.GetNextTalkIDForBrothers(ah.StudentID_FK, 1); 
 student.RecommendedNextTalkTypeID = nextTalkTypeId;
 student.NextCounselPoint = LINQ2ObjectsCode.GetNextCounselPoint(nextTalkTypeId,  
 student.NextCounselPoint);

 context.SaveChanges(); // ef
}