LINQ

**Language Integrated Query** (**LINQ**, borið fram „link“) er hluti af Microsoft .NET Framework sem bætir við þeim hæfileika á .NET tungumálin að gera fyrirspurnir og notar til þess setningarfræði sem minnir á SQL. Mörg af þessum hugtökum sem LINQ hefur kynnt voru upphaflega prófuð í rannsóknarverkefninu Cω hjá Microsoft. LINQ var gefið út sem hluti af .NET Framework 3.5, 19. nóvember 2007.

LINQ skilgreinir seríur af skipunum sem er hægt að nota til að gera fyrirspurnir, á verkefni til að aðgreina gögn í fylkjum, á teljanlega klasa, á XML, á venslaða gagnagrunna, og á þriðja aðila gagnaskrár. Á meðan það leyfir að gera fyrirspurn á hvaða gagnaskrá sem er, krefst það að gögnin séu þjöppuð saman sem hlutir. Þannig að, ef gagnaskráin er ekki upphaflega að geyma gögn sem hluti, verður að varpa gögnunum yfir í lén hlutsins. Fyrirspurnir sem eru skrifaðar sem skipanir eru framkvæmdar annað hvort af LINQ vinnslu eða með viðbótar vélbúnaði, sem afhendir það svo LINQ *skaffara* sem annað hvort útfærir aðskilda fyrirspurnarvinnslu eða þýðir yfir á annað snið sem verður framkvæmt á öðrum gagnagrunni (eins og t.d. á gagnagrunnsþjóni sem SQL fyrirspurnir). Niðurstaða fyrirspurnar er skilað til baka sem safni af hlutum sem geta verið teljanlegir.

## Uppbygging
### Staðlaðar fyrirspurnir
Seríur af fyrirspurnum sem eru skilgreindar af LINQ eru sýndar notandanum sem staðlaðar fyrirspurnir API. Fyrirspurnir sem API styður eru:
;Select / SelectMany: Select fyrirspurnin er notuð til að framkvæma vörpun á safn til að velja annað hvort alla gagnameðlimi sem mynda hlutinn eða hlutmengi af því. SelectMany fyrirspurnin er notuð til að framkvæma einn-til-margir vörpun, þ.e. ef hlutirnir í safninu innihalda annað safn sem gagnameðlim, er hægt að  nota SelectMany til að velja allt undirsafnið. Notandinn býr til fall, með nafnlausri aðgerð, sem velur gagnameðlimina. Kallað er í fallið fyrir alla hlutina til að kasta út óþörfum gagnameðlimum. Valið býr til hlut af öðru tagi, sem hefur annað hvort eins eða jafnmarga gagnameðlimi eins og upphaflegi klasinn. Búið verður að vera að skilgreina klasann til að hægt sé að þýða kóðann.
;Where: Where fyrirspurnin leyfir skilgreiningu á seríum af fullyrðingum sem eru metnar fyrir hvern hlut í safninu, og hlutir sem passa ekki við fullyrðinguna eru síaðir í burtu. Fullyrðingin er sett fram sem nafnlaus aðgerð (delegate).

### Framlenging á forritunarmál
Á meðan að LINQ er fyrst og fremst útfært sem bókasafn fyrir .NET Framework 2.0, er það einnig skilgreint sem framlenging á forritunarmál sem hægt er að útfæra á frjálsan hátt af forritunarmálum til að gera fyrirspurnir að fyrsta flokks forritunarmáli og útvega setningaskipanir til að skrifa fyrirspurnir. Þessi framlenging á forritunarmál hefur upphaflega verið útfærð í C# 3.0, VB 9.0 og Chrome, ásamt öðrum forritunarmálum eins og F# og Nemerle sem tilkynntu takmarkaðan stuðning. Framlengingar á forritunarmálum hafa að geyma:
*Setningafræði fyrirspurna: Forritunarmál eru frjáls til að velja sér setningafræði fyrirspurna, sem það mun sjálft viðurkenna. Þessi lykilorð forritunarmála verða að vera þýdd af þýðanda yfir á köll á viðeigandi LINQ föll. Forritunarmálin geta útfært skipanir um endurraðanir og aðrar hámarkanir á lykilorða plani.
*Lambda framsetning: Lambda framsetning er notuð til að búa til nafnlausar aðgerðir sem eru felldar inn í kóðann. Það leyfir að staðhæfingar og útdráttarföll séu skrifuð og felld inn í fyrirspurnir.
Til dæmis, í fyrirspurninni sem velur alla hluti í safninu `SomeProperty` sem eru minni en 10,


```csharp
int SomeValue = 5; 
 
 var results =  from c in SomeCollection
                let x = SomeValue * 2
                where c.SomeProperty < x
                select new {c.SomeProperty, c.OtherProperty};
 
 foreach (var result in results)
         Console.WriteLine(result);
```


tegundin af breytunum *result*, *c* og *results* eru allar ályktaðar af þýðandanum - ef gert er ráð fyrir að `SomeCollection` er `IEnumerable<SomeClass>`, *c* verður `SomeClass`, *results* verður `IEnumerable<SomeOtherClass>` og *result* verður `SomeOtherClass`, þar sem `SomeOtherClass` verður skilaklasi þýðanda með eingöngu `SomeProperty` og `OtherProperty` eigindi og eru gildin þeirra fengin frá samsvarandi afleiðingu af upphaflega hlutnum. Skipanir eru svo þýddar í fallaköll eins og:


```csharp
IEnumerable<SomeOtherClass> results = 
      SomeCollection.Where
      (
           c => c.SomeProperty < (SomeValue * 2)
      )
      .Select
      (
           c => new {c.SomeProperty, c.OtherProperty}
      )
 foreach(SomeOtherClass result in results)
      Console.WriteLine( result.ToString() );
```


## Heimildir
*