选择特定实体 LINQ 的属性

Posted

技术标签:

【中文标题】选择特定实体 LINQ 的属性【英文标题】:Select properties for particular entities LINQ 【发布时间】:2016-06-15 05:11:08 【问题描述】:

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

我有两个针对一个数据库的上下文。 ApplicationUser 是身份验证类,而 profileDTO 是我从同一个数据库中获得的配置文件信息。

ProfileDTO 属性:字符串 Id、字符串 FirstName、字符串 LastName

两个表共享相同的 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;
    
;

我想获取所有用户,但只在有个人资料的用户中设置名称。

【问题讨论】:

【参考方案1】:

您可以在 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();

【讨论】:

非常感谢。你能帮我用 LINQ 扩展方法重写它吗?【参考方案2】:

首先,我建议更新您的上下文以设置此类属性。如果你不能这样做,请使用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,
       ...
    

【讨论】:

@prutya no probs.. 如果解决了问题,请接受答案;) 不完全是解决方案...我需要所有用户,但其中一些可能没有他们的个人资料 @prutya - 使用左连接,在下面查看我的答案【参考方案3】:

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

MSDN

加上DefaultIfEmpty声明。

【讨论】:

以上是关于选择特定实体 LINQ 的属性的主要内容,如果未能解决你的问题,请参考以下文章

用于从实体类及其导航属性中选择多个列的 Linq Lambda 表达式

是否可以将 Linq 中的 lambda 参数化为实体选择

结合列表中实体的两个属性并将其与 Linq 展平

使用 LINQ 从选择中排除列

Linq to entity 使用“Func”在生成匿名对象的选择语句中创建属性

选择中的Linq到实体自定义功能