繁体   English   中英

使用linq查询如何更新multipul记录

[英]using linq Query how can i update multipul Records

在这里,我将ENQUIRY_CODE的Multipul值设为1,2,3

public void HRUpdateStatus(string ENQUIRY_CODE, int uid)
{
    var x = (from e in db.EMS_ENQUIRYREGISTRATION_MASTER
             where e.ENQUIRY_CODE == ENQUIRY_CODE
             select e).ToList();

    foreach (var abc in x)
    {
        abc.HRowner = uid;
        db.SaveChanges();
    }
    ...
}

请帮我在哪里我做错了

LINQ语句永远不会更改源序列
LINQ并非要这样做。

正确的解决方案取决于您使用哪种DbContext。 如果使用实体框架,则必须先获取项目,然后才能更新一个或多个属性。

在您的情况下,您想将所有获取的值的一个属性更改为相同的新值。 考虑为您的DbContext创建扩展功能。 查看神秘化的扩展方法

以下内容采用某个源类(TSource)的IQueryable序列,以及应在每个源元素上执行的操作。

public void ForEach<TSource>(this IQueryable<TSource> source,
    Action<TSource> action)
{
     var fetchedItems = source.ToList();
     foreach (var fetchedItem in fetchedItems)
     {
         action(fetchedItem);
     }
}

用法:

using (var dbContext = new MyDbContext())
{
     db.EMS_ENQUIRYREGISTRATION_MASTER
       .Where (registrationMaster => registrationMaster.ENQUIRY_CODE == ENQUIRY_CODE)
       .ForEach(registrationMaster => registrationMaster.HRowner = uid);
     db.SaveChanges();
}

我选择返回void而不是IEnumerable<TSource>来向函数用户指示查询的数据已实现并且可能已更改。 毕竟,以下内容可能令人困惑:

IQueryable<Student> students = ...
var updatedStudents = students.ForEach(student => student.Grades.Add(new Grade(...))
    .Take(2)
    .ToList();

您想传达的信息是所有学生都在更新,而不仅仅是2人。考虑返回IReadonlyList<TSource>或类似的内容,因此您不必再次实现数据。

我认为这是您的意思:

var codes = ENQUIRY_CODE.Split(',').ToList();

var x= db.EMS_ENQUIRYREGISTRATION_MASTER.Where(s => codes.Contains(s.ENQUIRY_CODE)).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM