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);
但这什么也没返回。
以下内容接受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;
}