2015-12-10 110 views
1

所以我有一种方法设计为使用可能或不可能在表中的键从表中获取单个值。改变一些名字后,我的方法看起来像这样。从表中获取单个值的最佳方法?

使用实体框架和LINQ

public IHttpActionResult GetBool(int Id) 
{ 
    Entity e = db.Entity.FirstOrDefault(x => x.Id== Id); 

    if (e == null) return NotFound(); 

    return Ok(e.BoolValue); 
} 

这一呼吁似乎没有必要,拉动整个整个实体只是解决一个值。如何错误检查可能不存在的实体,同时只抓取相关列?

我的解决方法是一样的东西

bool value = 
      (from e in db.Entity 
      where e.ID == Id 
      select e.BoolValue).ToList().ElementAtOrDefault(0); 
if(value== null) return NotFound(); 
return Ok(value); 

这是查询的最好方法?

解决方案:

顶端回答:

return db.Entity.Where(x => x.Id== Id) 
       .Select(x => Ok(x.BoolValue)) 
       .DefaultIfEmpty(NotFound()) 
       .First(); 

对于我个人的需求,我修改了它返回一个JSON对象。

+0

什么是'NotFound'和'Ok'和'disabled'什么类型是'BoolValue'?另外,为什么单个记录_heavy_? –

+0

改变了我的问题,以解决错误的价值,也不要说沉重和昂贵,而是说不必要的。我只是问最好的办法是什么。至于什么是NotFound和Ok,这些是状态码,由asp.net web api提供,而不是我自己制作的方法。对不起,我认为很明显BoolValue只是存储在实体内的一个值,它是一个布尔值。 – LordHoneydew

回答

4

您可以选择此列,并指定一个默认值:

return db.Entity.Where(x => x.Id== Id) 
    .Select(x => Ok(x.BoolValue)) 
    .DefaultIfEmpty(NotFound()) 
    .First(); 

然而,选择一个记录并返回它的一个栏目是不是真的很贵。如果它导致性能问题,您应该更好地使用一个查询获取多个记录,而不是在循环中始终执行GetBool

+0

啊,对不起。昂贵不是正确的词。我编辑它使其说“不必要”。 – LordHoneydew

1
var value = (from e in db.Entity 
      where e.ID == Id 
      select e.BoolValue).SingleOrDefault(); 
if(value == null) 
    return NotFound(); 
else 
    return Ok(value); 
+0

尽管此代码可能会回答问题,但为何和/或代码如何回答问题提供了更多背景,可以提高其长期价值。 – ryanyuyu

+0

嘿@ryanyuyu,上下文对我来说很有意义。查询将获取该值,SingleOrDefault()保证它将只返回一个值,如果它不存在,则返回null。 – LordHoneydew

+0

@LordHoneydew [只回答代码的答案](https://meta.stackoverflow.com/questions/290231/is-it-wrong-to-ask-for-a-description-of-how-why-the -code-作品,在代码只-ANSW)。这个至少是可读的,但解释确实提高了帖子的质量(如[Tim的回答](https://stackoverflow.com/a/34205252/4320665)提供了更多解释)。 – ryanyuyu

相关问题