用于简单数据模型和多对多关系的 Optimal Entity Framework 4 查询

Posted

技术标签:

【中文标题】用于简单数据模型和多对多关系的 Optimal Entity Framework 4 查询【英文标题】:Optimal Entity Framework 4 query for a simple data model and many-to-many relationships 【发布时间】:2011-10-03 17:52:55 【问题描述】:

我有一个简单的数据模型,我首先使用 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】:

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

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()
            ;

【讨论】:

谢谢,这似乎是我想要的......我想是时候提高 l2e 技能了 :)

以上是关于用于简单数据模型和多对多关系的 Optimal Entity Framework 4 查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL——一对多和多对多简单模型建表

MySQL——一对多和多对多简单模型建表

Typegoose 模型和多对多关系

具有外键和多对多关系的 Django 模型与同一模型

Cocoa,使用集合运算符和多对多关系属性进行绑定

简述数据库设计中一对多和多对多的应用场景?