2009-10-18 77 views
3

當我形成了下面的代碼linq迭代需要單行嗎?

Rabbit[] rbt= 
new Rabbit[] 
{ 
    new Rabbit{ Name="Jobby", Vegetable=new Vegetable{ VegiName="carrot"}}, 
    new Rabbit{ Name="hobby", Vegetable=new Vegetable{ VegiName="Beetroot"}} 
}; 

var s = from bt in rbt where 
     bt.Vegetable.VegiName.CompareTo("carrot") == 0 select bt; 

foreach (var v in s) 
{ 
       Console.WriteLine("{0}{1}",v.Vegetable.VegiName,v.Name); 
} 

我的查詢只返回單列,那麼爲什麼我需要的foreach迭代?我無法使用

Console.WriteLine("{0}{1}",s.Vegetable.VegiName,s.Name); directly ? 

回答

1

您可以使用Single method返回單個值。如果您懷疑它可能爲空(即沒有返回結果),請使用SingleOrDefault

Rabbit result = s.SingleOrDefault(); 

if (result != null) 
{ 
    // use result 
    Console.WriteLine("{0} : {1}", result.Vegetable.VegiName, result.Name); 
} 

正如其他人所提到的,另一種方法是使用一或FirstOrDefault採取返回的第一個結果,如果查詢返回大量結果。

8

編譯器是如何知道你的查詢只返回一行的? 假設您更改了數據以包含另一根胡蘿蔔 - 或根本沒有胡蘿蔔 - 您希望發生什麼。

如果你一定得到一個結果,請致電Single得到它。如果您可能得到多個結果,請致電First。如果您可能得到多個結果或沒有結果,請致電FirstOrDefault。如果您可能得到零或一個結果,請致電SingleOrDefault。例如,對於第一種情況:

var s = from bt in rbt where 
     bt.Vegetable.VegiName.CompareTo("carrot") == 0 select bt; 

var veg = s.Single(); 

Console.WriteLine("{0}{1}",veg.Vegetable.VegiName,veg.Name); 

或者:

var veg = rbt.Where(bt => bt.Vegetable.VegiName.CompareTo("carrot") == 0) 
      .Single(); 
Console.WriteLine("{0}{1}",veg.Vegetable.VegiName,veg.Name); 
+0

什麼是錯在 變種ķ從BT =在RBT從C在bt.Vegetable其中c.VegiName.CompareTo( 「胡蘿蔔」)== 0選擇C;宣言 ? – RusselUdana 2009-10-18 22:05:16

+0

「bt.Vegetable中b從rbt中c」不起作用,因爲bt.Vegetable不是IEnumerable。在「from c in ...」中,...必須是IEnumerable。 – itowlson 2009-10-18 22:09:33

+0

我從客戶中看到c, o在c.Orders where o.OrderDate> = new DateTime(1998,1,1) select new {c.CustomerID,o.OrderID,o.OrderDate}; 從微軟網站,所以我問。 – RusselUdana 2009-10-18 22:14:59

1

沒有,因爲LINQ不知道在編譯時間都要返回只有一行。使用First()或單次()操作:

var v = (from bt in rbt where 
     bt.Vegetable.VegiName.CompareTo("carrot") == 0 
     select bt) 
     .First(); 
2

因爲查詢IEnumerable<Rabbit>,不Rabbit的類型。儘管如此,您可以通過在查詢結束時使用FirstOrDefault()或SingleOrDefault()來獲得所需內容。

var s = (from bt in rbt 
     where bt.Vegetable.VegiName.CompareTo("carrot") == 0 
     select bt) 
     .FirstOrDefault();