如何以最聪明的方式执行此查询?

时间:2013-07-07 13:04:07

标签: c# .net linq entity-framework entity

基本上我有以下表格: 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);
                        }
                    }
                }
            }

1 个答案:

答案 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。通过将LeadLead.Owner投影到匿名类型,EF将加载两者,EF的关系修正将正确填充结果集合中的Lead.Owner属性。