【问题标题】:C# EF - Left join on a Included entity with a filterC# EF - 带有过滤器的包含实体的左连接
【发布时间】:2014-07-28 17:50:08
【问题描述】:

我有以下表结构

Orders
 OrderID PK

PartyAddresses
 PartyAddressID PK

然后我有一个将 PartyAddress 连接到订单的连接表

OrderAddresses
 OrderAddressID PK
 OrderID FK to Orders
 PartyAddressID FK to PartyAddresses
 AddressType  

我要转换的 sql 语句是

SELECT 
 * 
FROM 
Orders o  LEFT JOIN OrdersAddresses oa
       ON 
    o.OrderID = oa.OrderID
       LEFT JOIN PartyAddresses pa
          ON
       pa.PartyAddressID = oa.PartyAddressID
WHERE
    oa.AddressType = 'SHIP'

我无法将其复制到 Linq lambda 语句中

我已经能够通过从 OrdersAddress 表开始检索我想要的数据

OrdersAddresses.Include("Orders").Include("PartyAddresses").Where(oa=>oa.AddressType=="Ship");

但我需要IEnumerable<Orders> 形式的结果

更新

我想改写我的问题 - 给定以下存储库功能

public IQueryable<Orders> OrdersWithAddresses()
{
    return _context.Orders.Include("OrdersAddresses").Include("OrdersAddresses.PartyAddresses");
}

我将如何添加到表达式树以仅实际返回“SHIP”的订单地址

【问题讨论】:

标签: c# sql linq entity-framework linq-to-entities


【解决方案1】:

这不是我的想法,但我相信它应该有效。请注意,我已经删除了第一个 LEFT JOIN,因为由于 WHERE 子句过滤掉了 NULL,因此进行普通连接同样容易:

var results = from o in db.Orders
              join oa in db.OrdersAddresses on o.OrderID equals oa.OrderID
              join pa in db.PartyAddresses on oa.PartyAddressID equals pa.PartyAddressID into pas
              from p in pas.DefaultIfEmpty()
              where oa.AddressType == "SHIP"
              select new { o, oa, p };

更新:

或者,您可以修改存储库函数以包含 Where 子句:

public IQueryable<Orders> OrdersWithAddresses(Func<Orders, bool> predicate)
{
    var orders = _context.Orders.Include("OrdersAddresses").Include("OrdersAddresses.PartyAddresses");

    if(predicate != null)
        return orders.Where(predicate);

    return orders;
}

然后像这样调用函数:

var orders = OrdersWithAddresses(o => o.AddressType = "SHIP");

【讨论】:

  • 谢谢,但我需要将结果作为填充的订单对象图
  • 你能解释一下这是什么意思吗?
  • 您的解决方案会给我一个匿名对象列表,这些对象将所有 3 个组合为单独的属性。相反,为什么我需要一个填充的 Orders 对象,我可以使用导航属性向下钻取。前任。 results.First().OrderAddresses.First().PartyAddresses.City
  • 你需要做的就是更新最后一行,比如select new Order { ... };
  • 我认为这行不通,因为我不需要新订单 - 我需要 EF 返回的订单,包括更改跟踪等...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2013-09-19
  • 2021-07-29
相关资源
最近更新 更多