2009-10-18 72 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();