代码之家  ›  专栏  ›  技术社区  ›  Ralph Shillington

LINQ to实体框架是否可以进行外部联接?

  •  17
  • Ralph Shillington  · 技术社区  · 15 年前

    有许多使用Linq to SQL的外部联接的例子,所有这些例子都依赖于 DefaultIfEmpty() linq to entity framework不支持。

    这是否意味着使用.NET 3.5的Linq to实体不可能进行外部联接(我了解DefaultifEmpty随4.0一起提供,但目前我不能选择此项)

    有人能提供一个使用LinqToEntityFramework的简明示例吗?

    1 回复  |  直到 15 年前
        1
  •  35
  •   Craig Stuntz    15 年前

    在LINQtoEntities中,考虑的是关系而不是SQL连接。因此,实体上的SQL外部联接的文本等价物 Person 一对零或一对 CustomerInfo 将是:

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

    L2e将合并联接,以便如果customerinfo为空,则整个表达式的计算结果为空。因此,强制转换为可为空的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的集合。