C# 外部连接具有展平结果的多个表

C# 外部连接具有展平结果的多个表,c#,sql-server,linq,C#,Sql Server,Linq,我已经找到了很多关于外部联接的例子,但不能得到我想要的结果 有人知道在EF中不使用外键是否可以实现这一点吗 假设我有一个名为Persons的表,它包含 PersonID Name 现在我有一个名为FavFoods的表,其中PersonID可以存在很多次,也可以根本不存在 PersonID FoodName PersonID ShowName 我有一个名为FavShows的第三个表,其中PersonID也可以存在很多次或根本不存在 PersonID FoodName PersonID Sh

我已经找到了很多关于外部联接的例子,但不能得到我想要的结果

有人知道在EF中不使用外键是否可以实现这一点吗

假设我有一个名为Persons的表,它包含

PersonID
Name
现在我有一个名为
FavFoods
的表,其中
PersonID
可以存在很多次,也可以根本不存在

PersonID
FoodName
PersonID
ShowName
我有一个名为
FavShows
的第三个表,其中
PersonID
也可以存在很多次或根本不存在

PersonID
FoodName
PersonID
ShowName
使用lamda或类似sql的linq表达式,如何从dbcontext结果返回如下结果:

PersonID    FavFoods         FavShows
0           List<FavFoods>   List<FavShows>
1           List<FavFoods>   List<FavShows>
2           List<FavFoods>   List<FavShows>

如果在FavFood和FavShow表以及Person表之间定义了FK,则Person对象将定义为

PersonID int;
Name string;
ICollection<FavFood> FavFoods;
ICollection<FavShow> FavShows;
…人将包含一个Person实例列表,每个实例都将包含链接的FavFoods和FavShows列表

因此,基本上,如果您正确地设计了DB,您就可以直接得到您想要的

--编辑

考虑到您不能更改DB,最好的方法是将类定义更改为您希望的方式,即使用如上所述的ICollections。您需要向模型添加关联:右键单击模型背景并选择add>association,然后添加Person和FavFood表之间的关联,并重复FavShow


没有一条SQL语句可以运行所需的查询,因为任何SQL查询只能返回一种类型的行,而不能返回所需的多种类型。EF运行多个查询,一个用于“父母”(人),当访问孩子时,另一个用于孩子(FavFood和FavShow)。通过向模型中添加关联,将EF模型更改为包含FK,这是一种可行的方法。

是否使用实体框架?你的对象模型是什么?我在实际代码中使用实体框架。我没有这个特定示例的对象模型,在这里发布它已经过于简化了。但我想假设每个表都是独立的,没有外键链接它们,等等。模型看起来与PersonID、FoodName等所描述的完全一样。在这些表中可能添加FoodID和ShowID,因此它们具有唯一的键。在EF上使用外键和导航属性将使这变得很容易。如果您没有这些可用的,我认为您可以使用更复杂的select查询并返回一个新类型。Simon感谢您的回复。然而,我不能修改数据库,目前它没有外键,这将允许我做它的简单方式。我问的是如何通过示例获得我想要的结果,如图所示。没有外键,表之间根本没有链接。谢谢你的回答。让答案更清楚一点:不要在类中添加ICollections,将关联添加到模型中,ICollections将自动添加。Simon,再次感谢您的回复,我希望只点击数据库一次,以检索我需要的所有数据。我不是100%确定EF是否打了第二个电话,但我怀疑这会像你为我确认的那样。你知道让EF按照你的建议打第二个电话,还是单独打电话给食物和自己展示桌子更有效吗?如果我自己单独调用,我并不真正需要关联,因为我只需要两个单独的外部联接就可以按需要分离数据。如果你使用EF,我肯定会一直使用EF。维护一个有两种访问数据库方式的系统可能会变得一团糟。EF实际上相当高效。