一对多linq查询

时间:2015-05-31 02:50:57

标签: c# linq entity-framework lambda

我正在尝试获取未删除状态的客户列表和他们的订单。

我有一个客户实体

public class Customer
{
  public int Id {get;set;}
  public string Name {get;set;}
  public Collection<Order> Orders {get;set;}
}

我有一个像

这样的订单实体
public class Order
{
  public int Id{get;set;}
  public string Name {get;set;}
  public decimal Cost {get;set;}
  public int CustomerId {get;set;} 
  public Customer Customer {get;set;}
  public bool IsDeleted {get;set;}
}

我在努力获取未删除的客户及其订单列表。

我为实现上述要求所做的是,

var customers = (from customer in Customers
                     join order in Orders.Where(x=>!x.IsDeleted)
                         on customer.Id equals order.CustomerId
                  where !order.IsDeleted).ToList()

当我运行此查询时,我收到了包含所有订单(包括已删除= 1)的客户列表。

请帮我忽略已删除的订单。

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果您要过滤Orders的{​​{1}}以仅包含未删除的订单,则需要执行此操作。

然后应该创建从查询结果填充的新(分离的)Customer实例,或者可以创建匿名对象或特定的&#34; DTO&#34;实例:

Customer

请注意,由于没有public class CustomerView { public readonly int Id; public readonly string Name; public readonly List<Orders> Orders; } var customers = from customer in Customers select new CustomerView() { Id = customer.Id, Name = customer.Name, Orders = customer.Orders.Where(x=>!x.IsDeleted).ToList() }; 子句来限制您正在处理的返回客户数,因此有一个无限结果集作为此查询的输出。

如果您按ID加载特定客户,则可以使用以下方法来延迟加载&#34;延迟加载&#34;它的订单使用过滤器。注意:您需要将where替换为您自己的MyDbContext类型。

DbContext

答案 1 :(得分:0)

据我所知,C#需要一个select子句。如果您在建议的查询select new {customer, order}中添加一个,则会看到您的问题。您通过customer.Orders提取与客户相关的所有订单,而不仅仅是查询结果。