使用EF连接3个表的正确方法是什么

时间:2011-04-29 23:45:31

标签: .net sql-server linq entity-framework-4 linq-to-entities

可能是因为早上有点早,大脑运转不正常,但我对实体框架和SQL有疑问

假设我有2张桌子

消费 ConsumerID 名称 MembershipNumberID

MembershipEntry MembershipEntryID EntryDate MembershipNumberID

成员在拥有consumerID之前可以拥有MembershipNumberID。根据一个人的想法收集会员编号并在将其与consumerID关联之前第一次使用该编号。

我有些想加入这些表,所以我可以创建一个返回所有成员条目的查询,即使它们还没有与它们相关的消费者。

我试图将一个FK添加到MembershipEntry表中,但是它会失败,因为你预期会员表中会丢失id。

我是否只创建一个名为MembershipEntries的第3个表并拥有2个FK字段?

我可以使用类似

之类的东西创建基本联接
from item in ctx.MembershipEntry
     join c in ctx.Consumer on item.MembershipNumberID  equals c.MembershipNumberID
     select new MembershipViewModel()
     {
     .....................
     }

如果使用EF4包含所有参赛作品,即使他们没有会员编号但仍与他们联系,我如何终止左外联接呢?

2 个答案:

答案 0 :(得分:2)

在LINQ to SQL中,这看起来像这样。

from item in ctx.MembershipEntry
join c in ctx.Consumer on 
    item.MembershipNumberID equals c.MembershipNumberID into customers
from c in customers.DefaultIfEmtpy()
select new MembershipViewModel()
{
    ...
}

我希望它也适用于EF。

答案 1 :(得分:1)

您不需要第三个表将这两个数据表连接在一起(这就是为什么它是关系数据库!! WOOHOO!)。重点是使关联和提取数据变得“容易”。您只需要一个简单的SQL语句!

如:

SELECT * 
FROM MembershipEntry 
LEFT OUTER JOIN Consumer on Consumer.MembershipNumberID = MembershipEntry.MembershipNumberID

LEFT OUTER JOIN说“即使在Consumer表中没有任何内容可以匹配,也可以从MembershipEntry表中提供所有内容”

有关详细信息和示例,请参阅http://www.w3schools.com/sql/sql_join_left.asp

注意:某些数据库可能只使用LEFT JOIN但SQL使用LEFT OUTER JOIN