Sprog integreret forespørgsel

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 2. maj 2015; checks kræver 20 redigeringer .

Language Integrated Query (LINQ)  er et Microsoft -projekt til at tilføje SQL -lignende forespørgselssprogsyntaks til .NET Framework- programmeringssprogene . Tidligere implementeret i C# og Visual Basic .NET . Mange af de koncepter, som LINQ introducerer, blev oprindeligt testet i Microsoft Cω- forskningsprojektet .

LINQ blev udgivet med Visual Studio 2008 i slutningen af ​​november 2007. For hurtigt at oprette og fejlsøge LINQ-forespørgsler er der et specialiseret værktøj kaldet LINQPad .

Funktioner af sproget

Ved at bruge nogle nye sprogfunktioner, giver LINQ dig mulighed for at bruge SQL-lignende syntaks direkte i koden for et program skrevet, for eksempel i C#:

Datakilder

LINQ understøtter naturligt en forespørgselsmotor til samlinger af objekter i hukommelsen, relationelle databaser og XML -data og har en udvidelsesbar arkitektur, der giver tredjepartsudviklere adgang til deres datalagre gennem LINQ-motoren. For at gøre dette skal du implementere standardforespørgselsoperatorer ved hjælp af udvidelsesmetoder eller implementere IQueryable -grænsefladen , som giver dig mulighed for at parse udtrykstræet under kørsel og oversætte det til dit forespørgselssprog. Der er et eksempel på en tilpasset implementering af standardforespørgselsoperatører i fællesskabet. [en]

For eksempel bruger LINQ for SQL (tidligere DLinq), som oversætter LINQ-udtryk til SQL-forespørgsler mod en database, compilerens evne til at bygge et udtrykstræ baseret på programkontekst frem for at oprette funktionsdelegerede. Givet et udtrykstræ, der beskriver en forespørgsel, kan en specialiseret databaseudbyder parse den og oversætte den til en forespørgsel på det passende sprog for databasen, såsom Microsoft SQL Server, Jet (som bruges i Microsoft Access) eller enhver anden. Nogle entusiaster har allerede oprettet LINQ proof-of-concept-biblioteker til at forespørge WMI [2] , RSS , LDAP [3] , ADO.NET -datasamlinger , Amazon Web Services [4] og SharePoint [5] ved hjælp af denne taktik .

Den aktuelle forhåndsvisning fra Microsoft inkluderer også en implementering af LINQ til XML (tidligere kaldet Xlinq), som gør det meget nemmere at bygge og udtrække data fra et XML-dokument ved hjælp af lignende tilgange. Derudover arbejder Microsoft på ADO.NET vNext, også kendt som LINQ to Entities.

LINQ efter datakildetyper

LINQ til SQL

I slutningen af ​​2008 blev ansvaret for udviklingen af ​​LINQ til SQL sammen med ADO.NET Entity Framework (inklusive LINQ til Entities) flyttet til ADO.NET-udviklingsteamet (det såkaldte ADO.NET-team). mens LINQ til SQL tidligere blev udviklet af et team tilknyttet udviklingen af ​​en compiler til C# -sproget [6] . Det blev således indlysende, at begge løsninger er rettet mod at løse de samme problemer, og derfor vil konkurrere med hinanden. Lidt senere præciserede Tim Mallalew, at Microsoft ville fortsætte med at udvikle LINQ til SQL baseret på brugerfeedback. Men startende med .NET 4.0 er den anbefalede løsning LINQ to Entities. Baseret på input fra brugere vil de mest almindeligt anvendte funktioner i LINQ til SQL blive tilføjet til LINQ til Entities [7] . Som følge heraf vil der ske en gradvis sammensmeltning af løsninger.

Eksperter støttede generelt denne beslutning. Så for eksempel Marco Russo, selv om han tog forbehold for, at flytning til LINQ til Entities ikke burde være tidligere, end det bliver til en fuldgyldig erstatning for LINQ til SQL, erklærede ikke desto mindre, at det er en god idé at kombinere to delvist overlappende rammer, men samtidig bør de brugere, der er vant til at bruge "kasserede" dele af løsninger, ikke lide [6] .

LINQ til objekter

Det er intet andet end funktionel programmering forklædt som SQL [8] syntaks .

SQLMetal

LINQ-biblioteket inkluderer SQLMetal-værktøjet, som giver dig mulighed for automatisk at generere klasser direkte fra de databaser, der understøttes af .NET Framework, hvilket gør det meget hurtigt og nemt at integrere databaseentiteter i din kode. Et alternativ er den relationelle objektdesigner, der følger med Visual Studio, men den kan kun bruges med Microsoft SQL Server.

Eksempel

// type Northwind er en DataContext-efterkommer oprettet af SQLMetal // type Northwind.Orders is Table<Order> // type Northwind.Customers is Table<Kunde> Northwind db = new Northwind ( connectionString ); // nøgleordet 'var' bruges, da der ikke er noget navn på typen //, som forespørgselsresultatet tilhører var q = fra o i db . Bestillinger fra c i db . Kunder hvor o . Kvalitet == "200" && ( o . Kunde -ID == c . Kunde -ID ) vælg ny { o . Forfaldsdato , c . Firmanavn , c . Vare-ID , c . Varenavn }; // q refererer til et objekt af typen IEnumerable<T>, hvor T er en anonym type // genereret af compileren foreach ( var t in q ) { // t er stærkt skrevet, selvom dens type ikke har et navn // kendt ved skrivning af kode Konsol . WriteLine ( "DueDate Type = {0}" , t . DueDate . GetType ()); Konsol . WriteLine ( "Virksomhedsnavn (små bogstaver) = {0}" , t . Firmanavn . ToLower ()); Konsol . WriteLine ( "Vare-ID * 2 = {0}" , t . Vare -ID * 2 ); }

Se også

Noter

  1. En tilpasset implementering af .NET Standard Query Operators fra LINQ
  2. Spørg nemt din WMI ved hjælp af WMILinq! - Mielz' Thingamajig (downlink) . Hentet 21. juni 2007. Arkiveret fra originalen 10. april 2007. 
  3. The IQueryable tales - LINQ til LDAP - Del 0: Introduktion - B# .NET Blog
  4. Introduktion af Linq til Amazon - Fabrices weblog
  5. LINQ til SharePoint
  6. 1 2 LINQ til SQL vs LINQ til enheder - beslutninger fra ADO.NET-teamet Arkiveret 24. januar 2011.  (Engelsk)
  7. ↑ Præcisering af meddelelsen om L2S Futures  
  8. LINQ som et skridt mod funktionel programmering (Vlad Chistyakov, RSDN Magazine #2-2008)

Litteratur

  • Adam Freeman, Joseph C. Ratts Jr. LINQ: Language Integrated Query in C# 2010 for Professionals = Pro LINQ: Language Integrated Query i C# 2010. - M .: Williams , 2011. - S. 656. - ISBN 978-5-8459-1701-0 .

Links