C# 如果此表没有dotnet core web API中请求的数据,如何查询其他表

C# 如果此表没有dotnet core web API中请求的数据,如何查询其他表,c#,.net-core,asp.net-core-webapi,C#,.net Core,Asp.net Core Webapi,我相信有一个非常简单的解决办法,但似乎我找不到一个解决办法。我已经构建了一个web API来向前端返回一些数据,但问题是我想访问两个表来实现这一点。如果第一个表没有所需的数据,请转到下一个表,当前我使用的是simpletry-catchblock;我知道这样做很糟糕,所以代码是这样的 try { var answers = await _context.OfferedAnswers.FirstOrDefaultAsync(s => s.Id == answerId); an

我相信有一个非常简单的解决办法,但似乎我找不到一个解决办法。我已经构建了一个web API来向前端返回一些数据,但问题是我想访问两个表来实现这一点。如果第一个表没有所需的数据,请转到下一个表,当前我使用的是simple
try-catch
block;我知道这样做很糟糕,所以代码是这样的

try
{
    var answers = await _context.OfferedAnswers.FirstOrDefaultAsync(s => s.Id == answerId);
    answerText = answers.Value;
}
catch (Exception)
{
    var answers = await _context.Cols.FirstOrDefaultAsync(s => s.Id == answerId);
    answerText = answers.Label;
}

有人能给我建议一个更好的方法吗?提前谢谢。

假设
答案。Value
答案。Label
返回相同的类型,这是我能想到的。我以前没试过这个,所以可能没用。如果它真的有效,您只需要知道如何使用
wait
关键字。我不确定它是否可以直接贴在前面

answerText=\u context.OfferedAnswers.FirstOrDefaultAsync(s=>s.Id==answerId)==null

? 答案。标签:答案。值

假设
答案。Value
答案。Label
返回相同的类型,这是我脑海中能想到的。我以前没试过这个,所以可能没用。如果它真的有效,您只需要知道如何使用
wait
关键字。我不确定它是否可以直接贴在前面

answerText=\u context.OfferedAnswers.FirstOrDefaultAsync(s=>s.Id==answerId)==null

? 答案。标签:答案。值

您可以在访问其属性之前检查答案是否为空。 像这样:

If (answer == null)
....

在访问其属性之前,可以检查答案是否为null。 像这样:

If (answer == null)
....

对于标准方法,您应该检查
答案
是否为空,而不是
尝试catech异常

对于演示代码,如:

string answerText;
var answers = await _context.OfferedAnswers.FirstOrDefaultAsync(s => s.Id == answerId);
if(answers == null)
{
   var cols = await _context.Cols.FirstOrDefaultAsync(s => s.Id == answerId);
   answerText = cols.Label;
}
else
{ 
    answerText = answers.Value;
}
另一种方法是尝试linq查询

            var answerText =await (from f in _context.OfferedAnswers.Where(ft => ft.Id == id)
                          select f.Value)
                         .Union(
                          from s in _context.Cols.Where(st => st.Id == id)
                          select s.Label)
                         .FirstOrDefaultAsync();

对于标准方法,您应该检查
答案
是否为空,而不是
尝试catech异常

对于演示代码,如:

string answerText;
var answers = await _context.OfferedAnswers.FirstOrDefaultAsync(s => s.Id == answerId);
if(answers == null)
{
   var cols = await _context.Cols.FirstOrDefaultAsync(s => s.Id == answerId);
   answerText = cols.Label;
}
else
{ 
    answerText = answers.Value;
}
另一种方法是尝试linq查询

            var answerText =await (from f in _context.OfferedAnswers.Where(ft => ft.Id == id)
                          select f.Value)
                         .Union(
                          from s in _context.Cols.Where(st => st.Id == id)
                          select s.Label)
                         .FirstOrDefaultAsync();


请让我知道结果,因为我真的很好奇它是否有效:)您的答案假设
answers.Label``和
answers.Value`在同一个调用中收集。检查一个来自
提供的答案
,另一个来自
Cols
,这样就不会解决问题。只有在OfferedAnswers失败时才调用Cols,在这种情况下使用Label。否则,请使用OfferedAnswersAh的Value属性。很抱歉,您是正确的。这就是我在午夜试图回答问题的结果!正如@Fabulous所说,
标签
在不同的表中,两个表中不存在相同的ID。谢谢你的帮助。我同意你的努力。请让我知道结果,因为我真的很好奇它是否有效:)你的答案假设
answers.Label``和
answers.Value`是在同一个调用中收集的。检查一个来自
提供的答案
,另一个来自
Cols
,这样就不会解决问题。只有在OfferedAnswers失败时才调用Cols,在这种情况下使用Label。否则,请使用OfferedAnswersAh的Value属性。很抱歉,您是正确的。这就是我在午夜试图回答问题的结果!正如@Fabulous所说,
标签
在不同的表中,两个表中不存在相同的ID。谢谢你的帮助。我需要适当的努力。你想运行<代码> CLS.FrStReDebug()/>代码>只有当<代码>提供了答案。FrStuteDebug()//C>已经失败了,或者你不介意结果来自哪里?只有在提供的答案。FrStuteDebug()失败。在CSSE中考虑下面的AlESsio的答案。失败是否意味着
answers
将为空或
Value
属性将为空?答案将为空,因为给定ID没有答案,在这种情况下,查询下一个表(Cols)。在这种情况下,alessio似乎走上了正确的轨道。在分配给answersText之前,请检查是否为null。如果为空,则在捕获时检查
Cols
。您对使用try…catch控制程序流有保留是对的。您想仅在
提供了答案的情况下运行
Cols.FirstOrDefaultAsync()
。FirstOrDefaultAsync()
失败,或者您不介意结果来自何处?仅在提供了答案的情况下运行
Cols.FirstOrDefaultAsync()
失败了。在CSSE中考虑下面的答案。失败是否意味着
answers
将为空或
Value
属性将为空?答案将为空,因为给定ID没有答案,在这种情况下,查询下一个表(Cols)。在这种情况下,alessio似乎走上了正确的轨道。在分配给answersText之前,请检查是否为null。如果为空,则在捕获时检查
Cols
。您对使用try…catch控制程序流有保留是对的。请在回答中再加一点。他捕获的异常是由于他正在访问null对象的属性而引起的。因此,在做这项工作之前,他必须检查对象是否为空,如果不是空,他可以继续从另一个表中检索答案。谢谢@alesio。这是毫无例外的请在回答中再加一点。他捕获的异常是由于他正在访问一个空对象的属性而引起的。因此,在做这项工作之前,他必须检查对象是否为空,如果不是空,他可以继续从另一个表中检索答案。谢谢@alesio。这是毫无例外的这很有效。非常感谢。你能解释一下效率方面的差异吗?哪种方法更好?@Nishanchaturanga我担心这取决于不同的场景。对于第一种方法,如果
answers
为null,它将运行两个查询。对于第二种方式,它将只运行一个ti