左外连接 ObjectSet<T> 到 IQueryable

Left Outer Join ObjectSet<T> to IQueryable

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

供应商:

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

我想 运行 查询 returns 所有供应商按区域显示订单(如果有)和空白值(如果有 none)。因此,如果我想 运行 使用爱荷华州作为区域的查询,结果将是:

Vendor, OrderID
Alan,   
Brad,  O4
Cath,  O5

在 sql 中,我要么使用 where value = 'bar' or value is null 语法,要么使用内部联接创建临时 table,然后外部联接临时 table 和外部加入 table。我如何在 linq 中执行此操作?我似乎无法使用 '... or is null' 获取语法,而且我无法外部连接 Set 和 IQueryable (这是我从查询创建 'temp table' 时得到的结果。

这是我目前基于多次谷歌搜索并通过 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 };

这不会在 "join orders on v equals orders.Vendor into list" 行上使用 'orders is a variable, but is used like a type' 进行编译。

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

试试这个代码,先生

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 };

试试这个查询

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 };