2009-10-18 5 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을 사용하면 단일 값을 반환 할 수 있습니다. null이 될 수 있다고 의심되는 경우 SingleOrDefault을 사용하십시오 (즉, 결과가 반환되지 않음). 다른 언급했듯이

Rabbit result = s.SingleOrDefault(); 

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

는 다른 쿼리가 많은 결과를 반환하는 경우, 반환 된 첫 번째 결과를 취할 첫 번째 또는 FirstOrDefault를 사용하는 것입니다.

8

컴파일러는 쿼리가 단일 행만 반환한다는 것을 어떻게 알 수 있습니까? 다른 당근을 포함하도록 데이터를 변경했다고 가정합니다. 당근은 전혀 발생하지 않을 것입니다.

하나의 결과를 얻으려면 Single으로 전화하십시오. 결과가 여러 개인 경우 First으로 전화하십시오. 결과가 여러 개인 경우 또는없는 경우 FirstOrDefault으로 전화하십시오. 0 개 또는 하나의 결과를 얻으려면 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

; 선언? – RusselUdana

+0

bt.Vegetable이 IEnumerable이 아니므로 "bt.vegetable의 ctrl from bt.Vegetable"은 작동하지 않습니다. "from c in ..."에서 ...은 IEnumerable이어야합니다. – itowlson

+0

고객의 C에서 보았습니다. o에 있습니다. o.OrderDate> = new DateTime (1998, 1, 1) 새로운 {c.CustomerID, o.OrderID, o.OrderDate}를 선택하십시오. 마이크로 사이트에서 그래서 나는 물었다. – RusselUdana

1

아니, LINQ는 S는 하나의 행을 반환합니다 컴파일 타임에 알지 못하기 때문이다. 첫번째() 또는 싱글() 연산자를 사용

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

을하기 때문에 쿼리 IEnumerable<Rabbit>하지 Rabbit의 유형입니다. 하지만 쿼리가 끝나면 FirstOrDefault() 또는 SingleOrDefault()를 사용하여 원하는 것을 얻을 수 있습니다. bt.Vegetable에서 어디 c.VegiName.CompareTo ("당근") == 0 C C로부터 선택되는 통화 연결음에 BT =로부터 VAR의 K에 어떤 문제가 있는지

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