0

基本的に、次のテーブルを取得しました: UserProfile - UserId と、Referer Leadという名前の UserProfile が含まれています- Owner という名前の 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);
                        }
                    }
                }
            }
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ます。Leadandを匿名型に射影することでLead.Owner、EF は両方を読み込み、EF のリレーションシップ フィックスアップはLead.Owner結果コレクションのプロパティを正しく設定します。

于 2013-07-07T17:00:39.953 に答える