让用户成为包含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++;
}
有没有更好的方法?
答案 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 }
或其他有趣的博客:https://lostechies.com/jimmybogard/2014/03/12/avoid-many-to-many-mappings-in-orms/