2016-03-02 117 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