0

基本上我得到了以下表格: UserProfile - 包括一个 UserId 和一个名为 Referer Lead的 UserProfile - 包括一个名为 Owner 的 UserProfile (FK)

我要做的是获取特定用户配置文件的所有推荐的所有线索。

我正在考虑以下过程:获取用户配置文件的所有推荐对于每个推荐,获取所有者与推荐匹配的所有潜在客户。

我如何使用 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);
                        }
                    }
                }
            }
4

1 回答 1

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)不能使用。IncludeEF 将忽略Include. Lead通过将and投影Lead.Owner到匿名类型中,EF 将同时加载两者,并且 EF 的关系修复将Lead.Owner正确填充结果集合中的属性。

于 2013-07-07T17:00:39.953 回答