从SQL服务器中,提取包含所有已购买应用程序列表的用户列表(映射表)

时间:2017-06-07 14:19:46

标签: c# sql-server entity-framework linq

让用户成为包含ID作为主键的典型用户数据(名称,电子邮件...)的数据库。

Applications成为一个数据库,存储一个ID为主键的应用程序列表(名称,开发人员......)。

UsersApps成为两者之间的映射表,使用主键。因此,UsersApps存储..., {102, user1_Id, appA_Id}, {103, userN_ID, appB_Id}, {104, user1_Id, appC_Id}, ...行 等等。

我想检索用户数据列表{name, email, List<Application> boughtApps}

我正在努力寻找LINQ请求来做到这一点,我试图分两步完成,得到一个大表,然后构建每个用户的应用程序列表。

            var q1 = from user in _dbContext.Users
                     join appUti in _dbContext.AppUsers on user.Id equals appUti.UsersId
                     join app in _dbContext.Applications on appUti.ApplicationId equals app.Id
                     orderby user.Id
                     select new UserDataWithApp { Id = user.Id, Name = user.Name, firstName= user.FirstName, Email = user.Email, App = app };

然后解析q1.toList()以构建我所需的结果列表。

       var qRes = q1.ToList();
       int i = 0;
       int j = 0;
        while (i<qRes.Count())
        {
                listUsersWithApps[j] = qRes[i];
                while (qRes[i].Id == listUsersWithApps[j].Id) // llist is ordered !!
                {
                    listUsersWithApps[j].Apps.Add(qRes[i].Apps[0]);
                    i++;
                }
                j++;
     }

有没有更好的方法?

1 个答案:

答案 0 :(得分:1)

您可以使用导航属性来允许以下内容:

var userApps = context.Users.Select(u => new UserWithApp(u.Name, u.Email, u.Applications))

只需将以下内容添加到User

即可
public virtual ICollection<Application> Applications { get; set; }

Application

public virtual ICollection<Users> Users { get; set; }

所以你可以&#34;导航&#34;在您的实体之间写入以下查询(只需调整您的订购以及要选择的用户数据):

var userApps = from user in context.Users
               select new UserDataWithApp { ..., BoughtApps = user.Applications }

请点击此处查看示例:http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

或其他有趣的博客:https://lostechies.com/jimmybogard/2014/03/12/avoid-many-to-many-mappings-in-orms/