左外连接ObjectSet<这个IQueryable

本文关键字:这个 IQueryable ObjectSet 连接 | 更新日期: 2023-09-27 18:05:44

我试图在多个DbContext.Set s上进行左外连接和内连接,但内连接阻止外连接正常工作。我的表:

供应商:

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中怎么做呢?我似乎无法理解使用'…或者是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 };

这不会编译成'orders是一个变量',而是像' type'一样用于' join orders on v = orders '。

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

左外连接ObjectSet<这个IQueryable

试一下这个代码,先生

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