2013-05-08 34 views
6

chciałbym uzyskać tylko pierwszy rekord Zdaję sobie sprawę, The „Take() nie będzie działać.Get pierwszy element listy z kwerendy LINQ

Mam więc Lista że zapytania innej listy

List<string> etchList = new List<string>(); 
etchList.Add("709"); 

zapytanie LINQ jest

var query = (from vio in AddPlas 
      where etchList.Any(vioID => vio.Key.Formatted.Equals(vioID)) 
      select new 
      { 
       EtchVectors = vio.Shapes 
      }).ToList().Take(1); 

teraz to „Take (1)” będzie działać tylko wtedy, gdy miałem inne dane w etchList, więc to nie jest to, czego szukam. wyniki dostaję wyglądać to:

Sformatowanych
"clinesegs" 1013,98 5142,96 "LYR3_SIG2"
"clinesegs" 1020,16 5168,33 "LYR3_SIG2"
"clinesegs" 967,03 5151,31 "LYR3_SIG2"
"clinesegs" 971,43 5174,01 "LYR3_SIG2"

życzę aby tylko dostać z powrotem pierwszy „wiersz w liście

"clinesegs" 1013.98 5142.96 "LYR3_SIG2" 

EDIT:

Ok ten kod istnieje:

public class AddPla 
{ 
public AddPla() 
{ 
    Shapes = new List<Parse>(); 
} 

public Parse Key { get; set; } 
public Parse Pla { get; set; } 
public Parse Angle { get; set; } 
public Parse Default { get; set; } 
public List<Parse> Shapes { get; set; } 
public Parse DoubleBrace { get; set; } 
public Parse Number1 { get; set; } 
public Parse Number2 { get; set; } 
    } 

    public class Parse 
    { 

public string Formatted { get; set; } 
public string Original { get; set; } 

    } 

Potem ta lista

var AddPlas = new List<AddPla>(); 
+0

Przykro mi, nie był "T próbuję" ukryć "dowolny kod, po prostu nie napisałem pierwotnie myśląc, że to nie jest tak ważne, ale widzisz, jak kształtuje się lista typ –

+0

Więc, czekaj, chcesz dostać pierwsze 'Kształty' z każdego' AddPla'? – gunr2171

+0

Tak, przepraszam za to .... –

Odpowiedz

11

Ja nie przypuszczam, że to tak proste jak First()?

Jeśli oczekujesz, że zapytanie nie zwróci żadnych wyników, użyj FirstOrDefault()

Aktualizacja

Jeśli proszą o to „Get pierwszy Shapes z każdej AddPla”, a następnie dodać First do wyciągu select, raczej niż na koniec

select new { EtchVectors = vio.Shapes.First() } 
+0

Lub 'FirstOrDefault()' jeśli powinien * nie * rzucać. –

+0

@TobiasBrandt, dzięki, zaktualizowany. – gunr2171

+0

First i FirstOrDefault zarówno dają mi wszystkie 4 nadal sformatowane "clinesegs" 1013.98 5142.96 "LYR3_SIG2" "clinesegs" 1020.16 5168.33 "LYR3_SIG2" "clinesegs" 967.03 5151.31 "LYR3_SIG2" "clinesegs" 971,43 5174,01 "LYR3_SIG2" –

5

można spróbować z FirstOrDefault.

var query = (from vio in AddPlas 
      where etchList.Any(vioID => vio.Key.Formatted.Equals(vioID)) 
      select new 
      { 
       EtchVectors = vio.Shapes 
      }).FirstOrDefault(); 
+2

Nie trzeba wywoływać 'ToList()', 'FirstOrDefault()' może działać na surowym 'IEnumerable ' dobrze. – dlev

+0

ohh tak @dlev, Spóźniłem się, dzięki, że zredagowałem. – Sachin

+0

jeszcze dostać wszystkie 4 sformatowany "clinesegs" 1013.98 5142.96 "LYR3_SIG2" "clinesegs" 1020.16 5168.33 "LYR3_SIG2" "clinesegs" 967.03 5151.31 "LYR3_SIG2" "clinesegs" 971,43 5174,01 "LYR3_SIG2" –

0

Użyj metody FistOrDefault bezpiecznie powrócić pierwszy element z zapytaniem, czy null jeśli zapytanie nie przyniosło rezultaty:

lub równoważnie:

var result = AddPlas.Where(x => etchList.Any(y => x.Key.Formatted.Equals(y))) 
        .Select(x => new { EtchVectors = x.Shapes.FistOrDefault() }); 
+0

lubię składni initializer, ale ta składnia nie działa –

+0

@ChrisHamilton Przepraszamy, nie widzę zaktualizowanego pytania. Zaktualizowałem swoją odpowiedź, aby pasowała do najnowszych specyfikacji. –