linq查询实体框架如何连接表?导航属性?

时间:2016-06-23 11:31:57

标签: c# sql entity-framework linq

您好,我遇到问题,希望有人能解释一下我的答案!

所以在我的数据库中,我有3个表连接如下:

Customer         CustomerAddress        Address
-CustomerID      -CustomerID            -AddressID
-FirstName       -AddressID             -Street
-LastName                               -City

所以我创建了我的实体模型,并删除了中间表(CustomerAddress)并替换为导航属性?

所以我要做的是使用C#中的LINQ查询连接表。 在SQl中,查询看起来像这样:

Select *
From dbo.customer as c
left join dbo.customeraddress as ca on c.customerID = ca.customerID
left Join dbo.Address as a on a.addressID = ca.addressID

我意识到这不是这里的情况,因为没有customeraddress表。我是否使用导航属性列进行连接?在我的模型图中,我注意到Customer类/表中有一个名为Addresses的导航属性,它似乎映射到名为Customers的Address类/表属性。

所以我试过这个:

var customerQuery = (from customer in db.Customers
                     join address in db.Addresses on customer.Addresses equals address.Customers into add
                     from rt2 in add.DefaultIfEmpty()
                     select new { //.. });

但这显然是不正确的,因为我不确定如何处理导航属性以加入它们。如果有人能向我解释我如何加入这个模型,我真的很感激!

1 个答案:

答案 0 :(得分:1)

当你有导航属性时,你只需在你的查询中使用它们,就像它们是对象时那样 - 没有必要使用连接,EF会为你生成它们。

例如,您的查询将是这样的:

var customerQuery = (from customer in db.Customers
                     from address in customer.Addresses.DefaultIfEmpty()
                     select new { //.. });

这将为您生成left outer join。如果您需要inner join,请删除DefaultIfEmpty()