2017-02-02 2 views
1

В моем методе действий я бегаю следующий запрос, который возвращает список:Результат присоединиться Linq запрос к ViewModel

var list = db.WorkRoles. 
       Join(db.WorkRolesUsersDetails, 
       o => o.WorkRoleId, od => od.WorkRoleId, 
       (o, od) => new 
       { 
        WorkRoleId = o.WorkRoleId, 
        RoleName = o.RoleName, 
        RoleDescription = o.RoleDescription, 
        CompanyId = o.CompanyId, 
        WRUDId = od.WRUDId, 
        UserDetailsId = od.UserDetailsId, 
        FocusStart = od.FocusStart, 
        FocusEnd = od.FocusEnd 
       }).ToList(); 

У меня есть viemodel в том же формате, глядя, как это:

public class RoleViewModel 
{ 
    public RoleViewModel(int workRoleId, string roleName, string roleDescription, int companyId, int wRUDId, string userDetailsId, DateTime focusStart, DateTime focusEnd) 
    { 
     WorkRoleId = workRoleId; 
     RoleName = roleName; 
     RoleDescription = roleDescription; 
     CompanyId = companyId; 
     WRUDId = wRUDId; 
     UserDetailsId = userDetailsId; 
     FocusStart = focusStart; 
     FocusEnd = focusEnd; 
    } 
    int WorkRoleId { get; set; } 
    string RoleName { get; set; } 
    string RoleDescription { get; set; } 
    int CompanyId { get; set; } 
    int WRUDId { get; set; } 
    string UserDetailsId { get; set; } 
    DateTime FocusStart { get; set; } 
    DateTime FocusEnd { get; set; } 
} 

Каков наилучший способ преобразования результата моего запроса в список моей модели просмотра?

Одна вещь, которую я попытался из ответов здесь, на StackOverflow является:

var list = db.WorkRoles. 
       Join(db.WorkRolesUsersDetails, 
       o => o.WorkRoleId, od => od.WorkRoleId, 
       (o, od) => new 
       { 
        WorkRoleId = o.WorkRoleId, 
        RoleName = o.RoleName, 
        RoleDescription = o.RoleDescription, 
        CompanyId = o.CompanyId, 
        WRUDId = od.WRUDId, 
        UserDetailsId = od.UserDetailsId, 
        FocusStart = od.FocusStart, 
        FocusEnd = od.FocusEnd 
       }).ToList() 
       .Select(item => new RoleViewModel(
        item.WorkRoleId, 
        item.RoleName, 
        item.RoleDescription, 
        item.CompanyId, 
        item.WRUDId, 
        item.UserDetailsId, 
        item.FocusStart, 
        item.FocusEnd)); 

Но, к сожалению, что это у линьки не был список ог RoleViewModel s. Вот копия от стоимости части в отладчике:

{System.Linq.Enumerable.WhereSelectListIterator<<>f__AnonymousType6<int, string, string, int, int, string, System.DateTime, System.DateTime>, eksp.Models.RoleViewModel>} 
+2

Поместите '.ToList()' в конец вашего кода. – Mairaj

+2

Почему не просто '(o, od) => new RoleViewModel {....}). ToList();' –

ответ

3

Вы должны использовать ToList, чтобы получить список предметов. Вы назначаете запрос переменной list. Запрос откладывается, что означает, что она не будет выполнена, пока вы на самом деле получить результат с помощью вызова ToList, ToArray, First и т.д .:

List<RoleViewModel> list = db.WorkRoles. 
       Join(db.WorkRolesUsersDetails, 
       o => o.WorkRoleId, od => od.WorkRoleId, 
       (o, od) => new 
       { 
        WorkRoleId = o.WorkRoleId, 
        RoleName = o.RoleName, 
        RoleDescription = o.RoleDescription, 
        CompanyId = o.CompanyId, 
        WRUDId = od.WRUDId, 
        UserDetailsId = od.UserDetailsId, 
        FocusStart = od.FocusStart, 
        FocusEnd = od.FocusEnd 
       }).ToEnumerable() 
       .Select(item => new RoleViewModel(
        item.WorkRoleId, 
        item.RoleName, 
        item.RoleDescription, 
        item.CompanyId, 
        item.WRUDId, 
        item.UserDetailsId, 
        item.FocusStart, 
        item.FocusEnd)).ToList(); 

Лучший совет, который я могу дать вам: Избегайте использования var и указать типы, где вы можете. Если бы вы это сделали, ваш компилятор дал бы вам ошибку.

+0

Спасибо, это сработало. И спасибо за подсказку :) –

+3

И первый 'ToList' может быть' AsEnumerable', чтобы предотвратить создание бесполезного промежуточного результата. –

+0

@GertArnold: На самом деле его можно полностью отбросить. Я отредактирую ответ. – Sefe

Смежные вопросы