比方说,我有一个Order
表,它有一个FirstSalesPersonId
字段和一个SecondSalesPersonId
字段。这两个都是引用SalesPerson
表的外键。对于任何给定的订单,可以将一个或两个销售人员记入订单。换句话说,FirstSalesPersonId
永远不可能是NULL
,但SecondSalesPersonId
可以是是NULL
。我可以强制自动生成的Linq-to-SQL类使用OUTER JOIN吗?
当我将我的Order
和SalesPerson
表到“LINQ to SQL类”设计图面,该类建设者斑点从Order
表两个FK关系到SalesPerson
表,并因此产生Order
类有一个SalesPerson
场和一个SalesPerson1
字段(为了避免混淆,我可以将其重命名为SalesPerson1
和SalesPerson2
)。
因为我总是希望有营业员可用数据,每当我处理订单,我使用DataLoadOptions.LoadWith
指定两个营业员字段填充填充了单实例时,如下所示:
dataLoadOptions.LoadWith<Order>(o => o.SalesPerson1);
dataLoadOptions.LoadWith<Order>(o => o.SalesPerson2);
我遇到的问题是,LINQ到SQL是使用类似下面的SQL来加载顺序:
SELECT ...
FROM Order O
INNER JOIN SalesPerson SP1 ON SP1.salesPersonId = O.firstSalesPersonId
INNER JOIN SalesPerson SP2 ON SP2.salesPersonId = O.secondSalesPersonId
这将使意义,如果总有两个销售人员记录,但由于有时没有第二个销售人员(secondSalesPersonId
为NULL
),因此INNER JOIN
会导致查询在该情况下不返回任何记录。
我在这里有效地想要将第二个INNER JOIN
更改为LEFT OUTER JOIN
。有没有办法通过用于类生成器的用户界面来执行此操作?如果不是,我还能如何实现这一目标? (请注意,因为我几乎全部使用生成的类,所以如果我可以避免的话,我宁愿没有在这一种情况下加上一些东西)。
编辑:按我的评论回复中,SecondSalesPersonId
场是可空(在数据库中,并在生成的类)。
@Neil:它*为*可空(甚至在“链接到SQL类”UI中显示为空)。 – 2010-03-14 22:12:30
@尼尔:是的,如果我不使用LoadWith,那么它只会按需加载销售人员数据。但是,在我的情况下,我将在一个循环中处理数百个订单记录,这将意味着数百次访问数据库以单独获取每个销售人员记录。这正是我试图用LoadWith避免的。它与第一个销售人员记录一起工作;我试图让它与第二个一起工作。 – 2010-03-15 09:28:21
@Neil:谢谢,我非常感谢你的时间,但你已经有点离开了我想要去的地方,那就是当我实例化一个Order对象时,Order.SalesPerson1和Order.SalesPerson2字段在相同的数据库查询中同时填充。我不想编写SQL来执行它(或LINQ伪SQL),我只是希望它能像“简单”情况下那样工作。这似乎并不合理,因为这不是一个复杂的情况。 – 2010-03-18 11:32:07