2015-12-10 75 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

相關問題