选择特定实体 LINQ 的属性

本文关键字:属性 LINQ 实体 选择 | 更新日期: 2023-09-27 18:37:04

你可能可以看到我想要得到的结果。使用循环很容易,但我不明白如何使用 LINQ 扩展方法实现这样的结果

我有两个针对一个数据库的上下文。应用程序用户是身份验证类,以及我从同一数据库获得的配置文件DTO配置文件信息。

配置文件DTO属性:字符串Id,字符串名字,字符串姓氏

这两个表共享相同的 ID,但既不通过导航属性连接,也不通过数据库中的任何引用进行连接。

IEnumerable<ViewModels.User.IndexViewModel> model;
IEnumerable<Models.ApplicationUser> users;
var profilesDtos = _profileService.GetAll();
using (var context = new Models.ApplicationDbContext())
{
    users = context.Users.ToList();
}
model = users.Select(user =>
    new ViewModels.User.IndexViewModel
    {
        Id = user.Id,
        Email = user.Email,
        PhoneNumber = user.PhoneNumber,
        LockedOutTill = user.LockoutEndDateUtc ?? default(DateTime),
        Roles = UserManager.GetRoles(user.Id)
    });
foreach (var user in model)
{
    var userProfile = profilesDtos.FirstOrDefault(o => o.Id == user.Id);
    if (userProfile != null)
    {
        user.FirstName = userProfile.FirstName;
        user.LastName = userProfile.LastName;
    }
};

我想获取所有用户,但仅在具有配置文件的用户中设置名称。

选择特定实体 LINQ 的属性

你可以在 Linq 中使用左联接,如下所示 -

IEnumerable<ViewModels.User.IndexViewModel> model;
IEnumerable<Models.ApplicationUser> users;
var profilesDtos = _profileService.GetAll();
using (var context = new Models.ApplicationDbContext())
{
    users = context.Users.ToList();
}

model = (from u in users
join p in profilesDtos on u.Id equals p.Id into tempTbl
from up in tempTbl.DefaultIfEmpty()
select new ViewModels.User.IndexViewModel
{
    Id = u.Id,
    Email = u.Email,
    PhoneNumber = u.PhoneNumber,
    LockedOutTill = u.LockoutEndDateUtc ?? default(DateTime),
    Roles = UserManager.GetRoles(u.Id),
    FirstName = up!= null? up.FirstName : string.Empty;
    LastName =  up!= null? up.LastName  : string.Empty;
}).ToList();

首先,我建议更新您的上下文以设置此类属性。如果您不能执行此操作,请使用JOIN

var result =
    from user in context.Users
    join profile in userProfiles on user.ID equals profile.ID 
    select new ViewModels.User.IndexViewModel {
       Id = user.Id,
       FirstName = profile.FirstName,
       ...
    }

作为解决方案,您可以加入他们。

MSDN

加上 DefaultIfEmpty 语句。