gpt4 book ai didi

c# - 如何在 WebAPI 的 Controller 中使用 DTO?

转载 作者:行者123 更新时间:2023-11-30 13:36:04 25 4
gpt4 key购买 nike

我对如何在我的 WebAPI Controller 中使用 DTO 感到有点困惑。我正在使用 Entity Framework 的数据库优先概念。生成了以下实体数据模型:

//Generated class by EDM:
public partial class Address
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Address()
{
this.Member = new HashSet<Member>();
}

public int Id { get; set; }
public string Street { get; set; }
public Nullable<short> Street_Number { get; set; }
public Nullable<decimal> Zip { get; set; }
public string City { get; set; }
public string Country { get; set; }

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Member> Member { get; set; }
}

要使用数据注释,我需要定义一个 AddressDTO,因为每次我需要修改 EDM 时,数据模型都会再次生成,数据注释就会丢失。

接下来,我定义了 AddressDTO:

public class AddressDTO
{
public int Id { get; set; }
[Required]
[StringLength(100,ErrorMessage="The max. length of the street name is 100 characters.")]
public string Street { get; set; }
public Nullable<short> Street_Number { get; set; }
[Required]
public Nullable<decimal> Zip { get; set; }
[Required]
[RegularExpression(@"[a-z,A-Z]",ErrorMessage="Only characters are allowed.")]
public string City { get; set; }
[Required]
public string Country { get; set; }
}

Controller 看起来像下面的代码:

    [RoutePrefix("api/address")]
public class AddressController : ApiController
{
private PersonEntities db = new PersonEntities();

// GET: api/Address
[HttpGet]
[ResponseType(typeof(AddressDTO))]
public async Task<IHttpActionResult> GetAll()
{
var addressList = await db.Address.ToListAsync();

return Ok(addressList);
}
}

当我启动 RestAPI 以在浏览器中显示结果时,我总是得到以下 json 结果:

[
{
"Member": [ ],
"Id": 1,
"Street": "Example Street",
"Street_Number": 1,
"Zip": 12345.0,
"City": "New York",
"Country": "USA"
},...
]

但我需要以下预期结果:

[
{
"Street": "Example Street",
"Street_Number": 1,
"Zip": 12345.0,
"City": "New York",
"Country": "USA"
},...
]

有人知道我该如何解决吗?

最佳答案

您的新编辑仅意味着您不需要 IdMember AddressDTO 中的属性模型。你应该将结果塑造成 List<AddressDTO>当你回来的时候List<Address> .

因此只需从 AddressDTO 中删除未使用的属性即可然后通过选择新的 AddressDTO 来塑造结果和设置属性:

var result = db.Address.Select(x=> new AddressDTO()
{
Street = x.Id,
Street_Number = x.Street_Number,
City = x.City,
Country = x.Country
}).ToListAsync();

如果你想让 linq 更短,你可以将这样的构造函数添加到 AddressDTO :

public AddressDTO(Address x)
{
Street = x.Id;
Street_Number = x.Street_Number;
City = x.City;
Country = x.Country;
}

然后在 Controller 中:

var result = db.Address.Select(x=> new AddressDTO(x)).ToListAsync();

同样在大型项目中,您可以依赖一些对象映射器,如答案中提到的自动映射器。

关于c# - 如何在 WebAPI 的 Controller 中使用 DTO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40562496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com