C# Get方法专门用于处理0值
在我的WebAPI控制器方法中,我有C# Get方法专门用于处理0值,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,在我的WebAPI控制器方法中,我有 public IHttpActionResult GetMember(int id) { Member member = db.Members.Find(id); if (member == null) { return NotFound(); } return Ok(member); } 基本上,如果没有id=0的当前成员,它会在这
public IHttpActionResult GetMember(int id)
{
Member member = db.Members.Find(id);
if (member == null)
{
return NotFound();
}
return Ok(member);
}
基本上,如果没有id=0的当前成员,它会在这里进行检查,返回NotFound。。。这就是UI正在接收的内容
场景是,对于0值,API应该提供一个具有良好默认值的新项。有没有关于如何实现这一点的示例
我想出了这个办法,但没能让它正常工作
public IHttpActionResult GetMember(int id)
{
Member member = db.Members.Find(id);
if (id > 0)
{
var members = db.Members.Find();
member = members.FirstOrDefault((m) => m.MemberId == id);
//return NotFound();
if (member == null)
{
return NotFound();
}
else
{
db.Members.Add(member);
db.SaveChanges();
}
return Ok(member);
}
}
只需初始化一个新成员对象并将其返回给调用方法
public IHttpActionResult GetMember(int id)
{
Member member = new Member();
if (id > 0)
{
var members = db.Members.Find();
member = members.FirstOrDefault((m) => m.MemberId == id);
}
else
{
// Set some values if you need Ok(new Member { MemberId = 0, FirstName = "New"} )
}
return Ok(member);
}
只需初始化一个新成员对象并将其返回给调用方法
public IHttpActionResult GetMember(int id)
{
Member member = new Member();
if (id > 0)
{
var members = db.Members.Find();
member = members.FirstOrDefault((m) => m.MemberId == id);
}
else
{
// Set some values if you need Ok(new Member { MemberId = 0, FirstName = "New"} )
}
return Ok(member);
}
我不确定我是否理解目标,但如果我理解正确,可能会这样做:
public IHttpActionResult GetMember(int id)
{
Member member = db.Members.Find(id);
if (member == null)
{
if (id != 0)
{
member = new Member();
}
else
{
return NotFound();
}
}
return Ok(member);
}
这就是你想要的吗?我不确定我是否理解目标,但如果我理解正确,这可能就行了:
public IHttpActionResult GetMember(int id)
{
Member member = db.Members.Find(id);
if (member == null)
{
if (id != 0)
{
member = new Member();
}
else
{
return NotFound();
}
}
return Ok(member);
}
public IHttpActionResult GetMember(int id)
{
Member member = null;
if(id == 0)
{
member = new Member();
// Set default member values here
// member.MemberId = 123456;
// member.Name = "My Name";
// set other default property values.......
// Depending on why you are calling this method w/ a '0', you may or may not want to execute these next two lines. It's up to you.
db.Members.Add(member);
db.SaveChanges();
}
else
{
member = db.Members.Where(m => m.MemberId == id).FirstOrDefault();
}
if (member == null)
return NotFound();
return Ok(member);
}
这就是您想要的吗?以下是此代码所基于的原始代码:
public IHttpActionResult GetMember(int id)
{
Member member = null;
if(id == 0)
{
member = new Member();
// Set default member values here
// member.MemberId = 123456;
// member.Name = "My Name";
// set other default property values.......
// Depending on why you are calling this method w/ a '0', you may or may not want to execute these next two lines. It's up to you.
db.Members.Add(member);
db.SaveChanges();
}
else
{
member = db.Members.Where(m => m.MemberId == id).FirstOrDefault();
}
if (member == null)
return NotFound();
return Ok(member);
}
public IHttpActionResult Get(int id)
{
try
{
Product product;
var productRepository = new ProductRepository();
if (id > 0)
{
var products = productRepository.Retrieve();
product = products.FirstOrDefault(p => p.ProductId == id);
if (product == null)
{
return NotFound();
}
}
else
{
product = productRepository.Create();
}
return Ok(product);
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
要求从产品更改为成员,并包括EF
考虑保留对存储库的使用,并在存储库类中而不是在此处添加EF代码。
还考虑将一个重载添加到将获取ID并定位所需成员的存储库检索方法中。然后可以在此处删除对FirstOrDefault的调用。以下是此代码所基于的原始代码:
public IHttpActionResult Get(int id)
{
try
{
Product product;
var productRepository = new ProductRepository();
if (id > 0)
{
var products = productRepository.Retrieve();
product = products.FirstOrDefault(p => p.ProductId == id);
if (product == null)
{
return NotFound();
}
}
else
{
product = productRepository.Create();
}
return Ok(product);
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
要求从产品更改为成员,并包括EF
考虑保留对存储库的使用,并在存储库类中而不是在此处添加EF代码。
还考虑将一个重载添加到将获取ID并定位所需成员的存储库检索方法中。然后您可以在此处取消对FirstOrDefault的调用。我无法理解您的问题。您是说如果使用id值“0”调用GetMember(…),我们应该返回一个新的默认成员对象吗?但是,如果使用0以外的内容调用GetMember(…)方法,我们应该尝试在db.Members集合中找到相应的成员并返回它?如果找不到它,那么它应该返回“NotFound()”?因此您希望控制器创建一个新的
成员对象,并在成员为空时将其作为记录插入数据库?问题到处都是,实际上,你试图实现自己想要的东西并没有提供任何洞察。很难理解你到底想要什么。很抱歉给你带来困惑。我发现很难解释我的问题。是的,你们两位所解释的正是我想要达到的。我很难理解你们的问题。您是说如果使用id值“0”调用GetMember(…),我们应该返回一个新的默认成员对象吗?但是,如果使用0以外的内容调用GetMember(…)方法,我们应该尝试在db.Members集合中找到相应的成员并返回它?如果找不到它,那么它应该返回“NotFound()”?因此您希望控制器创建一个新的成员对象,并在成员为空时将其作为记录插入数据库?问题到处都是,实际上,你试图实现自己想要的东西并没有提供任何洞察。很难理解你到底想要什么。很抱歉给你带来困惑。我发现很难解释我的问题。是的,你们两位所解释的正是我想要实现的。你们不想立即保存默认用户,这会在用户打开添加屏幕时在数据库中创建一个新成员(至少我猜这就是这个调用的用途)。OP希望显示添加成员屏幕,其中包含注册的默认值或其他内容。我同意您的看法,他们可能不希望立即保存到DB,但这是在他们最初的尝试中发生的,因此我将其包含在流中。但是,您的警告是正确的,在创建默认值后立即添加它。。。您不希望数据库中有数千个从未实际使用过的用户。您不希望立即保存默认用户,这将在用户打开“添加”屏幕时在数据库中创建新成员(至少我猜这就是此调用的用途)。OP希望显示添加成员屏幕,其中包含注册的默认值或其他内容。我同意您的看法,他们可能不希望立即保存到DB,但这是在他们最初的尝试中发生的,因此我将其包含在流中。但是,您的警告是正确的,在创建默认值后立即添加它。。。您不希望成千上万的用户最终进入您的数据库,而这些用户从未实际使用过。@CodeCaster,您可能是对的。我据此编辑了答案。@CodeCaster,你可能是对的。我相应地编辑了答案。“或者将其添加到数据库并获取成员”请参见我的,您可能不想这样做,这取决于使用id=0调用此方法的原因。@CodeCaster,我完全同意,将其添加到数据库不是一个好主意。不确定上面的代码示例为什么要执行两次查找?建议:删除查找的第一个调用,而只声明成员变量。那么,只有当id>0时,才值得进行传递id的查找。如果查找随后找到该项,则不需要FirstOrDefault方法?@DeborahK有一个很好的建议。我使用了提交者所拥有的,只是做了一个小小的更改,您需要我更新我的答案吗?“或者添加到数据库中,让成员“查看我的,您可能不想这样做,这取决于为什么使用id=0调用此方法。@CodeCaster,我完全同意,将其添加到数据库中不是一个好主意。不确定上面的代码示例为什么要执行两次查找?建议:删除查找的第一个调用,而只声明成员变量。那么,只有当id>0时,才值得进行传递id的查找。如果查找随后找到该项,则不需要FirstOrDefault方法?@DeborahK有一个很好的建议。我用了什么