2010-10-07 69 views
8

在此示例代碼如何在LINQ中處理沒有結果?

public Company GetCompanyById(Decimal company_id) 
{ 
    IQueryable<Company> cmps = from c in db.Companies 
           where c.active == true && 
            c.company_id == company_id 
           select c; 
    return cmps.First(); 
} 

我應該如何處理,如果有沒有數據cmps

cmps永遠不會爲空,所以我怎麼能檢查在LINQ查詢不存在的數據?

這樣我就可以避開這個

'cmps.ToList()' threw an exception of type ... {System.NullReferenceException} 
轉變它的時候到例如

,一個列表

GetCompanyById(1).ToList(); 

難道我總是需要來包裝它在一個try catch塊?

回答

15

可以使用Queryable.Any()(或Enumerable.Any()),看看是否存在cmps成員。這可以讓你做明確的檢查,並按照你的意願處理它。

如果你的目標是隻返回null如果沒有比賽,只是用FirstOrDefault,而不是首先在return語句:

return cmps.FirstOrDefault(); 
+1

這真的應該是IMO接受的答案。 – 2013-02-08 22:26:25

5

如何應用.Any或.Count()?

這裏的MSDN上

爲例
List<int> numbers = new List<int> { 1, 2 }; 
bool hasElements = numbers.Any(); 
Console.WriteLine("The list {0} empty.", 
        hasElements ? "is not" : "is"); 

或者只是使用?:運算符

return myExample.Any() ? myExample.First() : null; 
1

嘗試return cmps.Count()==0?null:cmp.First()

這樣,如果它爲null,只會返回一個空公司與如果不是,那麼它將返回列表中的第一個。

退房http://en.wikipedia.org/wiki/Ternary_operation

+0

容易,只需使用FirstOrDefault(),因爲這是FirstOrDefault()的行爲......而且,更喜歡 「任何()」 到「COUNT()== 0「,因爲Count()如果有很多元素,將強制進行全面評估。 – 2010-10-07 18:38:54

+0

@Reed Copsey,剛纔看到你對FirstOrDefault()的回答沒有意識到它做了什麼,絕對有用。你的答案是正確的。 +1 – Gage 2010-10-07 18:41:37

2

這將返回第一個如果有,則返回null沒有:

return (from c in db.Companies 
where c.active == true && 
c.company_id == company_id 
select c).FirstOrDefault(); 
0
 var context = new AdventureWorksLT2008Entities(); 
     var cust = context.Customers.Where(c => c.CustomerID == 1); 
     if (cust.Any()) 
     { 
      Customer c = cust.First(); 
     }