C#MVC API数据传输对象

时间:2016-01-13 10:04:48

标签: c# asp.net-mvc model-view-controller dto

我希望能够在将我当前的设置转换为包含DTO的设置时遇到的问题得到一些建议。我想要做的是根据用户代码获取特定用户。但是我遇到了LINQ表达式中的一个问题

.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; }
}

3 个答案:

答案 0 :(得分:1)

您的方法需要返回一个实体。因此,使用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 :(得分:1)

Where方法返回模型的IEnumerable,但您只需要一个IEnumerable。您可以使用First或者更好的FirstOrDefault()来获取单个对象。

此外,action方法的返回类型是错误的,并且调用.AsEnumerable将从数据库中返回 all 数据。

此外,您使用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();
} 

答案 2 :(得分: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个。