【问题标题】:C# MVC API Data Transfer ObjectsC# MVC API 数据传输对象
【发布时间】:2016-01-13 10:04:47
【问题描述】:

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

【问题讨论】:

  • 在返回集合时将方法返回类型从 User 更改为 IEnumerable&lt;UserDTO&gt;
  • 首先您的查询返回一个集合,而不是单个对象(您需要使用FirstOrDefault()。接下来它会生成一个UserDTO,但您的方法返回类型为User(它们不一样)

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


【解决方案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。

【讨论】:

  • 方法也需要改成public UserDTO GetUser(string code)
  • @StephenMuecke thx,我没有关注不同的类型。
【解决方案2】:

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

此外,您的操作方法的返回类型错误,调用 .AsEnumerable 会将所有数据从数据库中带回。

此外,您使用 usrCode 作为您的路由值,但使用 code 作为您的操作参数。

所以,总而言之,你的方法应该是这样的:

[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();
} 

【讨论】:

    【解决方案3】:

    您对数据库的查询不正确。首先,最好在映射之前过滤值,然后只映射过滤后的用户。接下来,您应该只检索第一个用户。最佳查询将是:

    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 个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 2013-06-08
      • 1970-01-01
      相关资源
      最近更新 更多