2016-01-13 3 views
-1

Я надеюсь получить немного совета по проблеме, с которой я столкнулся с преобразованием моей текущей настройки в ту, которая включает в себя DTO. То, что я пытаюсь сделать, это получить конкретный пользователь на основе их кода пользователя. Но им наталкивается проблемы в выражении LINQОбъекты передачи данных C# MVC API

.AsEnumerable().Where(a => a.uCode == code); 

Он бросает эту проблему ....

cannot implicitly convert type system.collections.generic.ienumerable<DataModel.UserDTO>to'DataModel.Users'. An explicit conversion exists 

Мой метод:

[Route("api/Usr/{usrCode}")] 
public User GetUser(string code) 
{ 
    return db.Users.Select(s => new UserDTO 
    { 
     uid = s.uid, 
     firstName = s.firstName, 
     lastName = s.lastName, 
     email = s.emailAddress, 
     area = s.areaId, 
     uCode = s.uCode 
    }).AsEnumerable().Where(a => a.uCode == code); 
}   

Мой DTO:

public class UserDTO 
{ 
    public int uid { get; set; } 
    public String firstName { get; set; } 
    public String lastName { get; set; } 
    public String dob {get; set;} 
    public String email { get; set; } 
    public String profile { get; set; } 
    public String uCode { get; set; } 
    public int areaId { get; set; } 
} 
+0

Метод изменения возвращает тип от '' User'' до '' IEnumerable '' по мере возвращения коллекции –

+0

Во-первых, ваш запрос возвращает коллекцию, а не один объект (вам нужно использовать 'FirstOrDefault()'. генерирует 'UserDTO', но ваш метод возвращает тип' User' (они не совпадают) –

ответ

1

Ваш метод предполагает, что один e чтобы вернуться. Поэтому использовать First метод занять первое появление с данным кодом

public UserDTO GetUser(string code) 
{ 
    var user = db.Users.First(x=>x.uCode ==code); 
    return new UserDTO 
    { 
     uid = s.uid, 
     firstName = s.firstName, 
     lastName = s.lastName, 
     email = s.emailAddress, 
     area = s.areaId, 
     uCode = s.uCode 
    }; 
} 

И вы должны преобразовать DTO для объекта домена. Учтите, что лучше сначала фильтровать объекты домена, а только после этого создавать DTO.

+1

Метод также необходимо изменить на 'public UserDTO GetUser (строковый код)' –

+0

@StephenMuecke thx, я не обращал внимания для разных типов. – Artiom

1

Метод Where возвращает IEnumerable вашей модели, но вам нужен только один. Вы можете использовать First или, возможно, лучше FirstOrDefault(), чтобы получить один объект.

Кроме того, тип возвращаемого на ваш метод действий является неправильным и вызов .AsEnumerable принесет все данные обратно из базы данных.

Кроме того, вы используете usrCode в качестве значения вашего маршрута, но код как ваш параметр действия.

Итак, в сумме, ваш метод должен выглядеть следующим образом:

[Route("api/Usr/{code}")] 
public UserDTO GetUser(string code) 
{ 
    return db.Users.Where(a => a.uCode == code).Select(s => new UserDTO 
    { 
     uid = s.uid, 
     firstName = s.firstName, 
     lastName = s.lastName, 
     email = s.emailAddress, 
     area = s.areaId, 
     uCode = s.uCode 
    }).FirstOrDefault(); 
} 
0

Ваш запрос к базе данных не является правильным. Сначала лучше фильтровать значения перед отображением, а затем отображать только фильтрованных пользователей. Затем вы должны получить только первого пользователя. Оптимальный запрос будет:

public UserDTO GetUser(string code) 
{ 
    return db.Users 
      .Where(user => user.uCode == code) 
      .Take(1) 
      .Select(s => new UserDTO 
        { 
         uid = s.uid, 
         firstName = s.firstName, 
         lastName = s.lastName, 
         email = s.emailAddress, 
         area = s.areaId, 
         uCode = s.uCode 
        }) 
      .FirstOrDefault(); 
} 

Этот запрос будет перевести в код SQL:

SELECT TOP 1 
    uid = u.uid, 
    firstName = u.firstName, 
    lastName = u.lastName, 
    email = u.emailAddress, 
    area = u.areaId, 
    uCode = u.uCode 
FROM 
    Users u 
WHERE 
    u.uCode = @code 

Тогда, если у вас есть несколько пользователей с одинаковым кодом вы будете извлекать только 1 с сервера.

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

  • Нет связанных вопросов^_^