我希望能够在将我当前的设置转换为包含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; }
}
答案 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个。