【问题标题】:Left Outer Join ObjectSet<T> to IQueryable左外连接 ObjectSet<T> 到 IQueryable
【发布时间】:2015-07-31 03:32:34
【问题描述】:

我正在尝试对多个DbContext.Sets 进行左外连接和内连接,但内连接会阻止外连接正常工作。我的桌子:

供应商:

ID, Name
V1, Alan
V2, Brad
V3, Cath

地区:

ID, Name
R1, Ohio
R2, Utah
R3, Iowa

订单:

ID, VendorID, RegionID
O1,       V1,       R1
O2,       V1,       R2
O3,       V2,       R1
O4,       V2,       R3
O5,       V3,       R2
O6,       V3,       R3

我想运行一个查询,返回所有供应商,如果他们有任何显示订单的地区,如果他们没有,则返回空白值。因此,如果我想使用爱荷华州作为区域运行查询,结果将是:

Vendor, OrderID
Alan,   
Brad,  O4
Cath,  O5

在 sql 中,我要么使用where value = 'bar' or value is null 语法,要么使用内连接创建一个临时表,然后外连接临时表和外连接表。我如何在 linq 中执行此操作?我似乎无法使用 '... or is null' 获得语法,并且我无法外连接 Set 和 IQueryable(这是我从查询创建“临时表”时得到的。

这是我目前基于多次谷歌搜索并通过 SO 进行的尝试:

var orders = from o in context.Orders
            where o.RegionID == region.ID  // region is an object from the EF model 'Region' class
            select o;

var vendorOrders = from v in context.Vendors
                   where vendorNameList.Contains(v.Name) // vendorNameList is a string []
                   join orders on v equals orders.Vendor into list
                   from vo in list.DefaultIfEmpty()
                   select new { Vendor = v, Order = orders == null ? "" : orders.ID };

这不会与“订单是一个变量,但在“将 v 上的订单等于订单。供应商进入列表”行中的类型用作类型。

如何让所有供应商参与我的结果?

【问题讨论】:

  • 你能显示你想得到的sql查询吗?

标签: c# linq entity-framework outer-join


【解决方案1】:

先生试试这个代码

var vendorOrders = from v in context.Vendors
                   where vendorNameList.Contains(v.Name) // vendorNameList is a string []
                   join v1 in orders.toList() on v equals v1.Vendor into list
                   from vo in list.DefaultIfEmpty()
                   select new { Vendor = v, Order = orders == null ? "" : orders.ID };

【讨论】:

  • 这个答案以及问题下方@vittore 的评论有所帮助。似乎我做错了,不得不重新考虑这个过程。标记为答案,因为它帮助我找到了解决方案。
【解决方案2】:

试试这个查询

var vendorOrders = from v in context.Vendors.where(x=>vendorNameList.Contains(x.Name)) // vendorNameList is a string []
from o in context.Orders.where(x=>x.RegionID == region.ID && x. VendorID==v. ID).DefaultIfEmpty()
                   select new { Vendor = v, Order = orders == null ? "" : orders.ID };

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 2019-11-21
    • 2014-02-24
    • 2014-03-04
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多