C# Web API DTO 在 MVC 中组合了两个对象

本文关键字:对象 两个 组合 API Web DTO MVC | 更新日期: 2023-09-27 18:30:19

嗨,我是C#和DTO的新手,我正在寻找一些编写方法的建议。 基本上我有两个传输对象,成员和源。 我试图实现的是显示来自特定来源的成员列表。

唯一的问题是我需要能够显示与来自SourceRef的SourceId关联的成员。因为我不想传递敏感的 MemberID 和 SourceId,所以每个都有一个引用 ID,这就是我将在我的 API 中识别它们的方式

成员对象

public class MemberObj
{
    public int memId { get; set; }
    public String memRef { get; set; }
    public String fName { get; set; }
    public String lName { get; set; }
    public String email { get; set; }
    public String detail { get; set; }
    public int sourceId { get; set; }
}

源对象

public class SourceObj
{
    public int sourceId { get; set; }
    public String sourceRef { get; set; }
}

所以我想去地址,例如

http://..../api/Member/Source/{sourceRef}

并通过 sourceRef 显示与源 ID 关联的成员列表

我想出了类似的东西......

public IEnumerable<MemberObj> GetMem(String code)
    {
        var sc = db.Sources;
        var thisSrc = sc.Where(s => s.sourceRef == code).SingleOrDefault();

        return db.Members.Select(s => new MemberObj
        {
            memId = s.memId,
            firstName = s.firstName,
            lastName = s.lastName,
            email = s.emailAddress,
            memRef = s.memRef
          }).AsEnumerable().Where(s => s.sourceRef== thisSrc.sourceRef);

但这什么也没返回。

C# Web API DTO 在 MVC 中组合了两个对象

以下内容接受code作为源引用,并返回引用也对应的SourceID

从这里开始,它只是将所有成员过滤为仅具有匹配sourceID的成员。(我附近没有 VS 的副本,所以语法可能已经出来了!要是记事本++有智能就好了...

public IEnumerable<MemberObj> GetMem(String code)
{
    int soureID = db.Sources.Where(s => s.sourceRef == code).SingleOrDefault().sourceID; //I'm assuming code is the source ref??
    //Insert and handle your sourceID == 0 checks here.
    //...
    return db.Members.Where(m => m.sourceId == sourceID);
}

这应该有效:

public IEnumerable<MemberObj> GetMem(String code)
{
    var thisSrc = db.Sources
                    .Where(s => s.sourceRef == code)
                    .SingleOrDefault();
    if(thisSrc == null)
       return Enumerable.Empty<MemberObj>();
    return db.Members.Where(m => m.sourceId == thisSrc.sourceId);
}

考虑到,当给定code有多个源时,您应该处理这种情况(在这种情况下SingleOrDefault抛出异常。如果您确定这不是案例,请使用FirstOrDefault代替。

只是构建哈姆雷特的答案,你可以做这样的事情来返回一个 DTO 而不是你的成员实体:

public IEnumerable<MemberDTO> GetMem(String code)
{
    //Get the source object by sourceRef
    var thisSrc = db.Sources
                    .Where(s => s.sourceRef == code)
                    .SingleOrDefault();
    if(thisSrc == null)
       return Enumerable.Empty<MemberObj>();
   //Filter Members by sourceId and map the results to a MemberDTO with less fields
   var data = (from m in db.Members
               where m.sourceId == thisSrc.sourceId
               select new MemberDTO
               {
                   MemberId = m.memId,
                   //map the rest of your DTO fields..
               }).ToList();
    return data;
}