数据库名称: 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
我想比较两个表(countryno
和branchcode
),如果我没有第二个表值,请将它们添加到新表中,情况为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);
}
}
答案 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中即可。
希望有帮助