Linq to Entity Framework 是否可以进行外部联接

发布于 2024-08-12 10:01:08 字数 240 浏览 6 评论 0原文

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

这是否意味着使用 .NET 3.5 的 Linq to Entity 无法实现外连接(我知道 4.0 中包含 DefaultIfEmpty --- 但这对我来说目前不是一个选项)

有人可以提供一个使用 Linq to 的简洁示例吗实体框架。

There are many examples of outer join using Linq to Sql, all of them hinging on DefaultIfEmpty() which is not supported with Linq to Entity Framework.

Does this mean that outer join is not possible with Linq to Entity using .NET 3.5 (I understand that DefaultIfEmpty is coming with 4.0 --- but that's not an option at this time for me)

Could somebody please provide a concise example using Linq to EntityFramework.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一世旳自豪 2024-08-19 10:01:08

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

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

L2E 将合并联接,因此如果CustomerInfo 为 null,则整个表达式的计算结果为 null。因此,强制转换为可为 null 的 bool,因为推断出的不可为 null 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 一样。

In LINQ to Entities, think in terms of relationships rather than SQL joins. Hence, the literal equivalent of a SQL outer join on an entity Person with a one to zero or one relationship to CustomerInfo would be:

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

L2E will coalesce the join, so that if CustomerInfo is null then the whole expression evaluates to null. Hence the cast to a nullable bool, because the inferred type of non-nullable bool couldn't hold that result.

For one-to-many, you generally want a hierarchy, rather than a flat, SQL-style result set:

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

This is like a left join insofar as you still get orders with no details, but it's a graph like OO rather than a set like SQL.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文