最佳实体框架4查询简单数据模型和多对多关系

时间:2011-10-03 17:52:56

标签: c# .net sql entity-framework-4 entity-framework-4.1

我有一个简单的数据模型,我首先使用EF4.1代码(但问题似乎与任何EF4方法相关)作为存储和检索数据的ORM。 该模型看起来有点像:

public class Customer
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public virtual List<Product> Products { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Event> Events { get; set; }
    public virtual ICollection<Customer> Customers { get; set; }
}

public class Event
{
    public int EventId { get; set; }
    public string Name { get; set; }
    public virtual List<Product> Products { get; set; }
}

所以实体关系就像:

客户 ----- 产品 ----- 活动

事件影响N个产品(例如,价格上涨或产品交易) 每个客户都有N个产品属于他。

现在,对于数据库中的每个事件,我想获得受此事件影响的客户的集合(注意非重复条目)。如果客户至少有一件受此事件影响的产品,则该客户会受到该事件的影响。

天真的实施将是:

foreach (var ev in context.Events)
{
  foreach(var product in ev.Products)
  {
    //Check for customers with this product and add them to the list of affected customers
  }
}

但这似乎是一种反模式。问题是: 如何编写查询以更有效的方式解决此问题? (也许linq,但即使是原生SQL也会有帮助)?

1 个答案:

答案 0 :(得分:1)

您可能正在寻找这样的查询:

var query = from ev in context.Events
            select new
            {
              Event = ev,
              AffectedCustomers = (from pr in ev.Products
                                   from cu in pr.Customers
                                   select cu).Distinct()
            };