2016-03-02 167 views
0

您可以看到我想要得到的结果。这很容易使用循环,但我不明白如何使用LINQ扩展方法实现这样的结果为特定实体选择属性LINQ

我有两个上下文针对一个数据库。 ApplicationUser是我从同一个数据库获得的认证类和profileDTO配置文件信息。

ProfileDTO属性:串ID,串名字,姓氏串

两个表共享相同的ID,但不连接既不通过导航属性也不在DB的任何引用。

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(); 
+0

非常感谢。你还可以帮我使用LINQ扩展方法重写它吗? – prutya

0

首先,我会建议更新您的上下文以设置此属性。如果你不能做到这一点使用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, 
     ... 
    } 
+0

谢谢,已经得到它 – prutya

+0

@prutya没有probs ..接受的答案,如果它解决了这个问题;) –

+0

不完全的解决方案。 ..我需要所有的用户,但其中一些可能没有他们的个人资料 – prutya