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

时间:2016-01-08 16:27:09

标签: c# sql-server linq

我在外连接上找到了很多例子但是不能得到我想要的结果。

有没有人知道在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

1 个答案:

答案 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,这是可行的方法。