Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包含/加入问题的实体框架_C#_Linq_Tsql_Entity Framework 4 - Fatal编程技术网

C# 包含/加入问题的实体框架

C# 包含/加入问题的实体框架,c#,linq,tsql,entity-framework-4,C#,Linq,Tsql,Entity Framework 4,我已经实现了在上演示的表继承功能 所有外键和约束都已就位 现在,我正在使用实体框架将我的人员、学生、老师和家长拉回来,模型如下所示(没有所有EF特定属性等) 现在,我需要得到所有人,无论类型如何,他们都是25岁,不超过100条记录,我想包括所有引用的数据。我创建我的EF查询,如下所示: IQueryable<People> query = Entities.People.Include("PeopleParent")

我已经实现了在上演示的表继承功能

所有外键和约束都已就位

现在,我正在使用实体框架将我的人员、学生、老师和家长拉回来,模型如下所示(没有所有EF特定属性等)

现在,我需要得到所有人,无论类型如何,他们都是25岁,不超过100条记录,我想包括所有引用的数据。我创建我的EF查询,如下所示:

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