18

有很多使用 Linq to Sql 进行外连接的示例,所有这些示例都依赖于DefaultIfEmpty()Linq to Entity Framework 不支持的示例。

这是否意味着使用 .NET 3.5 无法使用 Linq to Entity 进行外部连接(我知道 DefaultIfEmpty 随 4.0 一起提供——但这对我来说目前不是一个选项)

有人可以提供一个使用 Linq to EntityFramework 的简洁示例。

4

1 回答 1

36

在 LINQ to Entities 中,考虑关系而不是 SQL 连接。Person因此,在具有一对零或一对关系的实体上的 SQL 外连接的字面意思CustomerInfo是:

var q = from p in Context.People
        select new
        {
            Name = p.Name,
            IsPreferredCustomer = (bool?)p.CustomerInfo.IsPreferredCustomer
        };

L2E 将合并连接,因此如果 CustomerInfo 为 null,则整个表达式的计算结果为 null。因此强制转换为可空 bool,因为推断的不可空 bool 类型无法保持该结果。

对于一对多,您通常需要一个层次结构,而不是一个扁平的 SQL 风格的结果集:

var q = from o in Context.Orders
        select new 
        {
            OrderNo = o.OrderNo,
            PartNumbers = from od in o.OrderDetails
                          select od.PartNumber
        }

这就像一个左连接,因为你仍然得到没有细节的订单,但它是一个像 OO 的图而不是像 SQL 的集合。

于 2009-11-20T14:45:59.247 回答