C# 包含/加入问题的实体框架
我已经实现了在上演示的表继承功能 所有外键和约束都已就位 现在,我正在使用实体框架将我的人员、学生、老师和家长拉回来,模型如下所示(没有所有EF特定属性等) 现在,我需要得到所有人,无论类型如何,他们都是25岁,不超过100条记录,我想包括所有引用的数据。我创建我的EF查询,如下所示:C# 包含/加入问题的实体框架,c#,linq,tsql,entity-framework-4,C#,Linq,Tsql,Entity Framework 4,我已经实现了在上演示的表继承功能 所有外键和约束都已就位 现在,我正在使用实体框架将我的人员、学生、老师和家长拉回来,模型如下所示(没有所有EF特定属性等) 现在,我需要得到所有人,无论类型如何,他们都是25岁,不超过100条记录,我想包括所有引用的数据。我创建我的EF查询,如下所示: IQueryable<People> query = Entities.People.Include("PeopleParent")
IQueryable<People> query = Entities.People.Include("PeopleParent")
.Include("PeopleStudent")
.Include("PeopleTeacher");
query.Where(x => x.Age == 25)
.Take(100);
IEnumerable<People> results = query.ToList();
为什么第一个Include用作内部联接
,我的问题有解决方案吗
**更新1**
假设我使用Ladislav Mrnka,由于Linq和Lambda查询的显著变化,还有两个额外的需求
问题:如何搜索具有特定属性的特定人员
(所有成绩为“a”的学生)
答复:
context.People.OfType<Student>().Where(s => s.Grade == "A");
List<People> result = new List<People>();
result.AddRange(context.People.OfType<Student>()
.Where(x => x.PrimaryFocus == "Math")
.ToList());
result.AddRange(context.People.OfType<Teacher>()
.Where(x => x.PrimaryFocus == "Math")
.ToList());
context.People.OfType()。其中(s=>s.Grade==“A”);
问题:我如何搜索任何拥有特定财产的人
(PrimaryFocus=“数学”的所有学生或教师)
答复:
context.People.OfType<Student>().Where(s => s.Grade == "A");
List<People> result = new List<People>();
result.AddRange(context.People.OfType<Student>()
.Where(x => x.PrimaryFocus == "Math")
.ToList());
result.AddRange(context.People.OfType<Teacher>()
.Where(x => x.PrimaryFocus == "Math")
.ToList());
列表结果=新列表();
result.AddRange(context.People.OfType())
.其中(x=>x.PrimaryFocus==“数学”)
.ToList());
result.AddRange(context.People.OfType())
.其中(x=>x.PrimaryFocus==“数学”)
.ToList());
对于您来说,显而易见的解决方案应该是对继承使用本机EF支持。就你而言。一旦获得继承权,您只需调用:
IEnumerable<People> results = Entities.People
.Where(x => x.Age == 25)
.Take(100)
.ToList();
IEnumerable results=Entities.People
.其中(x=>x.年龄==25)
.拿(100)
.ToList();
它将返回学生
、教师
、家长
等实例
在您的解决方案中,唯一的建议是检查关系是否是可选的(1-0..1)-。如果需要,它将使用
内部联接
。如果它是可选的,并且仍然使用内部连接
,则可能是您的模型中存在一些错误或其他问题。对于您来说,显而易见的解决方案应该是使用本机EF支持进行继承。就你而言。一旦获得继承权,您只需调用:
IEnumerable<People> results = Entities.People
.Where(x => x.Age == 25)
.Take(100)
.ToList();
IEnumerable results=Entities.People
.其中(x=>x.年龄==25)
.拿(100)
.ToList();
它将返回学生
、教师
、家长
等实例
在您的解决方案中,唯一的建议是检查关系是否是可选的(1-0..1)-。如果需要,它将使用
内部联接
。如果它是可选的,并且仍然使用内部连接
,则可能是您的模型中存在一些错误或其他问题。我没有在EF中使用继承支持。如果我选择进入这个“兔子洞”使用继承,当家长和老师没有成绩属性(只有学生)时,如果我查找.Where(x=>x.Grade==“A”)
,它对搜索有何影响?你不能搜索人而是搜索学生:上下文.People.OfType()。Where(s=>s.Grade==“A”)
。继承很棘手,而且会带来巨大的性能成本(这将在.NET4.5中得到改进)但这是数据库的最佳解决方案。第二个问题可能没有简单的答案。除非共享属性在Person
类中,否则您必须分别查询学生和教师。您可以尝试使用两个查询的Union
的一些技巧,但由于学生的Union,因此在强制转换时会出现问题代码>和教师
查询将不起作用(它们属于不同类型).EF是关于在面向对象查询中思考的,因此不是每个关系查询都可以直接翻译。因为我返回的是IENumerable
,所以我应该能够进行两个单独的查询,并将两个查询结果组合成一个结果。它将在Linq to对象中工作,其中隐式转换为人可以工作,但可能不会在Linq to中工作-联合集所在的实体必须具有相同的列。因此,您必须单独执行这些查询,并在从数据库返回后将它们联合到单个IEnumerable
。我没有在EF中使用继承支持。如果我选择进入这个“兔子洞”使用继承,那么如果我查找,它会对搜索产生什么影响?在哪里(x=>x.Grade==“A”)
,当家长和老师没有Grade
属性时(仅限学生)?您无法搜索人,但要搜索学生:上下文.People.OfType()。其中(s=>s.Grade==“A”)
。继承很棘手,而且它有很大的性能成本(这将在.NET 4.5中得到改进)但这是数据库的最佳解决方案。第二个问题可能没有简单的答案。除非共享属性在Person
类中,否则您必须分别查询学生和教师。您可以尝试使用两个查询的Union
的一些技巧,但由于学生的Union,因此在强制转换时会出现问题代码>和教师
查询将不起作用(它们属于不同类型).EF是关于在面向对象查询中思考的,因此不是每个关系查询都可以直接翻译。因为我返回的是IENumerable
,所以我应该能够进行两个单独的查询,并将两个查询结果组合成一个结果。它将在Linq to对象中工作,其中隐式转换为人可以工作,但可能不会在Linq to中工作-联合集所在的实体必须具有相同的列。因此,您必须单独执行这些查询,并在从数据库返回后将它们联合到单个IEnumerable
。