基本上我有以下表格: UserProfile - 包括一个名为Referer的UserId和UserProfile 潜在客户 - 包含名为所有者的UserProfile(FK)
我要做的是获取特定用户配置文件的所有引荐的所有线索。
我在考虑以下过程: 获取userprofile的所有引用 对于每个推荐,获取所有者与推荐匹配的所有潜在客户。
我如何使用LINQ to entity执行此(或可能更智能)?
我一直在搞乱以下事项:
var referrals = db.UserProfiles.Where(u => u.Referer.UserId == UserId);
var allLeads = db.Leads.Include("Owner").Where(l => true);
List<Lead> totalLeads = new List<Lead>();
if (referrals.Any())
{
foreach(UserProfile u in referrals.ToList())
{
var leads = allLeads.Where(l => l.Owner.UserId == u.UserId);
if (leads.Any())
{
foreach (Lead l in leads.ToList())
{
totalLeads.Add(l);
}
}
}
}
答案 0 :(得分:1)
您的代码有1个(referrals.Any()
)+ 1(referrals.ToList()
)+ 2 *个引荐数(leads.Any()
和leads.ToList()
,每个引用者)单独的数据库查询。您应该能够通过单个数据库查询获得结果。我认为这个例子应该这样做:
List<Lead> totalLeads = db.UserProfiles
.Where(u => u.Referer.UserId == UserId)
.Join(db.Leads, u => u.Referer.UserId, l => l.Owner.UserId,
(u, l) => new { Lead = l, Owner = l.Owner })
.AsEnumerable()
.Select(x => x.Lead)
.ToList();
奇怪的AsEnumerable().Select(x => x.Lead)
是必要的,因为在加入实体时你不能使用Include
。 EF将忽略Include
。通过将Lead
和Lead.Owner
投影到匿名类型,EF将加载两者,EF的关系修正将正确填充结果集合中的Lead.Owner
属性。