我在外连接上找到了很多例子但是不能得到我想要的结果。
有没有人知道在EF中使用外键是否可行?
假设我有一个名为Persons的表
PersonID
Name
现在我有一个名为FavFoods
的表,其中PersonID
可以存在很多次或根本不存在。
PersonID
FoodName
我有一个名为FavShows
的第3个表,其中PersonID
也可以存在多次或根本不存在。
PersonID
ShowName
使用像linq表达式这样的lamda或sql,我将如何从我的dbcontext结果返回:
PersonID FavFoods FavShows
0 List<FavFoods> List<FavShows>
1 List<FavFoods> List<FavShows>
2 List<FavFoods> List<FavShows>
而不是像这样的事情,在每个可能的结果组合中重复这个人:
PersonID FavFoods FavShows
0 (0, Broccoli) (0, Seinfeld)
0 (0, Broccoli) (0, Simpsons)
1 (1, Peas) (1, HSN)
1 (1, Broccoli) null
1 (1, Peas) null
1 (1, Broccoli) (1, HSN)
2 null null
答案 0 :(得分:1)
如果在FavFood和FavShow表与Person表之间定义了FK,则Person对象将被定义为
var people = from p in context.Persons select p;
ICollection就像一个List。然后你的Linq查询将是:
{{1}}
...人们将包含一个Person实例列表,每个实例都包含链接的FavFoods和FavShows的列表。
所以基本上,如果你正确地设计数据库,你可以立即得到你想要的东西。
- 编辑
鉴于您无法更改数据库,最好的方法是将类定义更改为您希望它们的方式,即使用上述ICollections。您需要为模型添加关联:右键单击模型背景,然后选择添加&gt;关联,并添加Person和FavFood表之间的关联,并重复FavShow。
没有单个SQL语句可以运行您想要的查询 - 不管是什么SQL查询都只能返回一种类型的行,而不是您想要的多种类型。 EF运行多个查询,一个用于父母的查询。 (人),然后其他人为孩子们访问(FavFood和FavShow)。通过添加与模型的关联来更改EF模型以包含FK,这是可行的方法。