我有一个简单的数据模型,我首先使用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也会有帮助)?
答案 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()
};