使用 except() 从列表中排除项目

Use except() to exclude items from List

正在尝试使用 Except 从列表中排除项目。但是以下代码对我不起作用,即我的列表仍然包含它应该排除的记录。有什么明显的我做错了吗?我的循环有问题吗?顺便说一句,这段代码的反面是有效的,即当运行时匹配时插入正确的记录。

        [HttpPost]
        public JsonResult InsertActivities([FromBody] List<MemberData> customers)
        {
            var mData =_context.MemberData.Select(x => x.RunTime).ToList();
            foreach (var item in mData)
            {
                var exclude = customers.Where(x => x.RunTime == item).ToList();
                var list = customers.Except(exclude).ToList();

                foreach (var data in list)
                {
                    _context.MemberData.Add(data);
                }
            }
            int insertedRecords = _context.SaveChanges();
            return Json(insertedRecords);
        }

首先确保你的模型设计如下:

public class MemberData:IEquatable<MemberData>
{
    public int Id { get; set; }
    public string RunTime { get; set; }

    public bool Equals(MemberData other)
    {
        if (other is null)
            return false;

        return this.RunTime == other.RunTime;
    }
    public override bool Equals(object obj) => Equals(obj as MemberData);
    public override int GetHashCode() => (RunTime).GetHashCode();
}

然后像下面这样更改您的代码:

public JsonResult InsertActivities([FromBody] List<MemberData> customers)
{
    //hard-coded the value...
    //customers = new List<MemberData>()
    //{
    //    new MemberData(){RunTime="aa"},
    //    new MemberData(){RunTime="bb"},
    //    new MemberData(){RunTime="ee"},
    //};   //hard-coded the value...
    var mData = _context.MemberData.ToList();
    var list = customers.Except(mData);
    foreach (var item in list)
    {
        foreach (var data in list)
        {
            _context.MemberData.Add(data);
        }
    }
    int insertedRecords = _context.SaveChanges();
    return Json(insertedRecords);
}

注:

为了成功将数据插入数据库,如果您的模型包含主键,请确保数据的(after did Except operation)键不与现有数据库数据重复。或者你可以像我在上面的代码中所做的那样不为主键设置值。