2017-09-13 70 views
0

我写了一个简单的select来查找数据库中的搜索数据。事情是,在我的情况下,当数据库中没有项目时,方法返回一个空的json。搜索选择不返回NotFound方法

[Route("api/Atributes/{value}")] 
public IHttpActionResult GetAtributeByValue(string value) 
{ 
    var atribute = (from a in db.Atributes 
        join p in db.Cards on a.Atr_Nr equals p.Card_Nr 
        where a.Atr_Value == value 
        select new Employee 
        { 
         Name = p.Name, 
         Surname = p.Surname, 
         Number = a.Atr_Value 
        }); 

//this is statement id not working 
    if (atribute == null) 
    { 
     return NotFound(); 
    } 

    return Ok(atribute); 
} 

问题是:这种搜索方法是否正确?如果不是,我应该怎样做另一种方式?

回答

3

将您的结果集转换为列表并使用其长度属性进行检查。 LINQ推迟执行。使用.ToList()获取实际的结果集。

[Route("api/Atributes/{value}")] 
public IHttpActionResult GetAtributeByValue(string value) 
{ 
    var atribute = (from a in db.Atributes 
        join p in db.Cards on a.Atr_Nr equals p.Card_Nr 
        where a.Atr_Value == value 
        select new Employee 
        { 
         Name = p.Name, 
         Surname = p.Surname, 
         Number = a.Atr_Value 
        }).ToList(); 

//use count, if that does not work, length here 
    if (atribute.Count() == 0) 
    { 
     return NotFound(); 
    } 

    return Ok(atribute); 
} 
+0

谢谢。完美的作品;) –

+0

如果你使用'ToList()',那么使用'Count()'是无用的,因为它会迭代整个序列。你应该使用'Count'属性。 –

+0

IEnumerable有count属性吗?另外,他必须最终返回数据。 – Amit

0

看起来像这样的方法是尝试一个Atribute列表。所以,你只返回属性附加伤害直接

[Route("api/Atributes/{value}")] 
public IHttpActionResult GetAtributeByValue(string value) 
{ 
var atribute = (from a in db.Atributes 
       join p in db.Cards on a.Atr_Nr equals p.Card_Nr 
       where a.Atr_Value == value 
       select new Employee 
       { 
        Name = p.Name, 
        Surname = p.Surname, 
        Number = a.Atr_Value 
       }); 

    return Ok(atribute); 
} 

编辑: 为什么不404(未找到)?

404状态码应该保留用于未找到资源的情况。在这种情况下,您的资源是Atribute的集合。这个集合存在,但它目前是空的。如果我有一天有200天,而第二天有404则是因为某人碰巧删除了一些Atributes,所以作为您的应用程序的客户端的作者非常困惑。我应该做些什么?我的网址错了吗?有人更改了API并忽略了重定向。

+0

对我来说,他想要返回一个NotFound HTTP错误代码。 – Amit