实体比较除外并插入问题?

时间:2018-11-07 20:31:32

标签: c# entity-framework

数据库名称: S

表格:学生

ID   NAME   COUNTRYNO   AGE   BRANCHCODE
----------------------------------------
1    Alex    001        25       05
2    Mary    002        26       09

数据库名称: P

PERSON

 NAME   COUNTRYNO   AGE   BRANCHCODE  
------------------------------------------
 John     127        45      04
 Elize    125        54      06

我要新建表格:

数据库名称: S

NEWPERSON

 NAME   COUNTRYNO   AGE   BRANCHCODE  SITUATION
----------------------------------------------------
 John     127        45      04          0
 Elize    125        54      06          0

我想比较两个表(countrynobranchcode),如果我没有第二个表值,请将它们添加到新表中,情况为0。 >

但是此代码无法运行。如何在实体框架中解决?

var student=DbContext.Entities.Student.Select(a=> new { CountryNo =a.CountryNo, BranchCode=a.BranchCode
});     ------>  //studentcount:0

var person=DbContext.Entities.Student.Select(a=> new { CountryNo =a.CountryNo, BranchCode=a.BranchCode
});     ----> //personcount:0

var common=person.Except(student);   -----> //common:0

List<NEWPERSON> np= new List<NEWPERSON>();   ---> np:0
foreach(var item in common)   //it doesnt enter loop
{
    var ıtem=person.Single(persons=>persons.PERSON==item.PERSON && persons.CountryNo==item.CountryNo);
if(tempItem !=null)
{
    NEWPERSON newperson=new NEWPERSON
{  
     CountryNo=item.CountryNo,
     BranchCode=item.BranchCode,
     Age=item.Age,
     Name=item.Name,
     Situation=0
}
np.Add(newperson);
}

}

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的要求,则需要-从Table Student中不存在的Table Person中提取值,并将其添加到Table NewPerson中。

现在要强调的第一件事是使用相交。来自MSDN documentation “相交的结果将产生一组匹配值的相交”。因此,通过将两个表相交,您的结果通常是一个空集。使用“相交”的另一个重要因素是相交对象必须是同一类型。例如int,Person或Student和“匿名”(这很重要)。

该代码的另一个问题是您创建一个空的NewPerson列表并将其添加到Student表中。

我提出的解决方案如下:

获取面向学生和人们的对象的完整列表

var students = DbContext.Entities.Student().ToList();
var people = DbContext.Entities.Person().ToList();

使用Except而不是Intersect,它将为您提供一组不匹配的元素:

    var peopleNotRegisteredAsStudents = people.Select(person => new { person.CountryNo, person.BranchCode }).Except(
        students.Select(student => new { student.CountryNo, student.BranchCode })
        );

在peopleNotRegisteredAsStudents中将结果映射为NewPerson列表:

    List<NewPerson> personInf = new List<NewPerson>();
    foreach (var item in peopleNotRegisteredAsStudents)
    {
        var tempItem = people.SingleOrDefault(person => person.BranchCode == item.BranchCode && person.CountryNo == item.CountryNo);
        if (tempItem != null)
        {
            NewPerson newPerson = new NewPerson
            {
                ID = tempItem.ID,
                Name = tempItem.Name,
                CountryNo = tempItem.CountryNo,
                Age = tempItem.Age,
                BranchCode = tempItem.BranchCode,
                Situation = 0
            };

            personInf.Add(newPerson);
        }
    }

然后添加到NewPerson表

DbContext.Entities.NewPerson.AddRange(personInf);
DbContext.Entities.SaveChanges();

如果需要将NewPerson结果添加到Student表中,则只需将NewPerson值映射为Student对象,然后将其添加到Student中即可。

希望有帮助