Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie

Door , , 53 reacties
Bron: Infoworld

Op de Professional Developers Conference heeft Anders Hejlsberg, hoofdontwikkelaar van het .Net-framework, Microsofts nieuwe integratietaal LINQ gepresenteerd, waarmee het bedrijf een brug wil slaan tussen databasequery's en de objectgeoriŽnteerde talen van het .Net-framework. LINQ moet het makkelijker maken om informatie uit verschillende databronnen te integreren in applicaties die in deze talen zijn geschreven. De technologie biedt eenduidige queryconstructies om data aan te spreken uit verschillende bronnen, zoals databases of XML-documenten. Hejlsberg zegt dat veel developers zich vaak net loodgieters voelen, omdat ze verbindingen moeten aanleggen tussen de databasetaal en de applicatietaal. LINQ moet voor deze problematiek een oplossing bieden.

LINQ voorbeeld
Hier wordt een array gemanipuleerd alsof het een database is; de data wordt met een SQL-achtige expressie gefilterd

De technologie kan gezien worden als een extensie van Microsofts .Net-talen zoals C# en Visual Basic, en zal volgens Hejlsberg naar alle waarschijnlijkheid worden geÔntegreerd in toekomstige versies van Microsofts Visual Studio en SQL Server. Met de nieuwe taalelementen kunnen zowel al bekende datastructuren, zoals arrays, als databases worden aangesproken. Voor databases is het niet meer nodig om SQL-objecten aan te maken en daar de query in stringvorm naartoe te sturen; query-expressies kunnen voortaan door de applicatie zelf uitgevoerd worden. Doordat er ťťn programmeermodel wordt gebruikt zou programmacode leesbaarder en makkelijker te debuggen worden en zou het bovendien makkelijker worden om code te hergebruiken.

Moderatie-faq Wijzig weergave

Reacties (53)

Ik zie het nut hier niet van in.. het is nu juist mooi dat je de boel scheid van elkaar! $sql = ""; , en ook wil je die queries beter checken en niet direct uitvoeren..
Ik vraag me af of dit veiligheid tegenwerkt of niet..
query-expressies kunnen voortaan door de applicatie zelf uitgevoerd worden
Als het ook betekent dat SQL commando's die naar de SQL server gestuurd worden echt als statements gebruikt kunnen worden en niet als string, dan kan het een voordeel zijn dat de compiler een spelfout zoals "selct" compile time dus eruit haalt.

Echter als de letterlijke SQL taal van de betreffende database gebruikt kan worden zal het ongetwijfeld alleen met MS SQL werken. Aangezien SQL een standaard is waarbij iedereen heeft besloten z'n eigen standaard te bedenken.
Als nu mooi alles scheid:
$sql = "SELCT n FROM numbers"; (<- letop typo)

Wanneer gaat dit fout? Dit gaat fout wanneer je dit uitvoert en dat duurt mogelijk nog wel even.
Het niet scheiden, maar de queries als taal onderdeel maken zorgt ervoor dat je de boel eens goed met elkaar kan vergelijken.

Veel webapplicaties,. zoals Wikies, fora en webmail systemen hebben vaak beveiligings problemen. 9 van de 10 keer is het een injection problem. Een systeem als linq
lost dit op.

Maar dit is oud nieuws in een nieuw jasje, in de jaren 80 was een soortgelijk systeem verplicht door ANSI voor talen als COBOL, FORTRAN, Pascal en ADA icm SQL.

edit: :9 mike_mike was me net voor met exact dezelfde typo!
Dit gaat fout wanneer je dit uitvoert en dat duurt mogelijk nog wel even.
Bij het (unit-)testen hoor je alle code te raken en dus het mislukte statement te ontdekken

Als je je SQL niet dynamisch opbouwt, maar met parameters werkt dan kan je je queris op verschillende manieren redelijk testen.

Gewoon cut/pase in een tool waarmee je sql kan uitvoeren: doe een explain plan of equivalent (dat kan juist ook als je de parameters nog niet van een waarde hebt voorzien)

Als je je SQL-strings in een apart bestand hebt kan je dit ook nog makkelijk automatiseren.

Maar (wat mijn voorganger zojuist al typt) lijkt het hier niet (primair) bedoeld om queries uit een database te halen maar uit bijv. xml documenten.
(Met Borland ontwikkeltools als Delphi kon ik in 1999 al een 'echt' SELECT statement op tekstbestanden draaien!)

Ik ben er zelf niet helemaal uit of ik vind dat je dit allemaal maar in de programmeertaal zelf moet stoppen i.p.v. het gewoon als library mee te leveren.
Ik hou er wel van dat je tenminste nog een beetje weet wat er onderwater uiteindelijk ongeveer gebeurt. Dat is sinds OO al aardig duister geworden.
Vroeger typte je een statement en wist je gewoon welke assembler er uit voortkwam...
Daar tegenover denk ik dat het gemak zo verslavend werkt dat je het bezwaar gauw vergeten bent, net als OO.
Leuk in theorie, maar linq is vooral gericht op de praktijk neem ik aan.
Het gaat er juist om dat je een query language kan gebruiken op objecten die niet in een database zitten, zoals in dit voorbeeld een array.

Heel erg handig! (maar volgens mij niet zo vernieuwend als dat het nu gebracht wordt)
Het werkt juist goed voor veiligheid. Eťn van de grootste veiligheidsproblemen van deze tijd is dat mensen gewoon rechtstreeks via internet ontvangen variabelen in hun queries plakken. Aangezien de webtaal het gewoon als een string ziet en de database gewoon als een normale query is er geen enkele manier om hier goed op te controleren.

Bovendien maakt het op deze manier niet uit of je Oracle, MySQL, Xml bestand of plain text gebruikt

(hoewel ik dit meer als een proof-of-concept zie, ik heb liever dat ze het wat verder uitwerken en met datadrivers werken)
Nou, lijkt me juist zeer nuttig. Zou heel fijn zijn om op een array, collection of willekeurig welk ander data object bijvoorbeeld een 'DISTINCT' uit te kunnen voeren.

En zo zijn er nog wel wat voorbeelden die programmeer technisch een voordeel kunnen geven.
Bij de eerste beta van WinFS, die onlangs is uitgebracht werd te 'taal' genaamd 'OQuery' nog gebruikt. Die is georven van het ObjectSpaces project dat is gecanceld omdat het teveel overeenkomsten had met WinFS. Er werd bij de beta al vermeld dat de OQuery-taal waarschijnlijk vervangen zou worden. Ik denk dat dit dan de opvolger zal zijn.

WinFS en deze taal-extensie zullen er samen voor zorgen dat het onderscheid tussen objecten in het geheugen en persistente objecten op een server zullen vervagen en direct vanuit de programmeer taal kunnen worden gemanipuleerd, zoals dat nu al kan met objecten in het geheugen.

Via deze link zal de komende dagen waarschijnlijk meer informatie te vinden zijn: http://commnet1.microsoftpdc.com/content/downloads.aspx
Voor databases is het niet meer nodig om SQL-objecten aan te maken en daar de query in stringvorm naartoe te sturen; query-expressies kunnen voortaan door de applicatie zelf uitgevoerd worden.
Kijk dat maakt het programmeren een stuk eenvoudiger, ook kan je compiler dan al fouten uit queries halen waardoor deze nooit in een productieomgeving te zien zullen zijn. Over het algemeen maakt dit het programmeren dus een stuk eenvoudiger (om een heleboel redenen)
Met de nieuwe taalelementen kunnen zowel al bekende datastructuren, zoals arrays, als databases worden aangesproken.
Kijk dat maakt een hoop dingen heel veel gemakkelijker, je hoeft niet meer na te denken over sorteeralgoritmes en het optimaliseren daarvan. Dit wordt allemaal overgenomen door de compiler. Dit zal ervoor zorgen dat programmeren nog makkelijk wordt en bovendien programma's beter en sneller werken.

Voor mensen die denken: Huh? Das toch niet echt SQL.

Het is GEEN SQL, het is LINQ, het lijkt op SQL maar dat komt omdat alle data query talen enigsinds op elkaar lijken. Je ziet vaak dat als iets hetzelfde doel heeft het erg op elkaar lijkt (en soms ook helemaal niet!). Het lijkt dus op SQL maar het is geen SQL.

Typisch geval van: It looks like a duck, it walks like a duck, it quacks like a duck but it is not a duck!

Een goede stap denk ik van Microsoft, niet dat dit heel orgineel is maar door het te integreren in hun (veelgebruikte) programmeer talen verbeteren ze juist die programmeertalen.
Dit lijkt eigenlijk heel veel constructies die al sinds 1980 (oid) in de taal Smalltalk zitten.

[code]
#(5 4 1 3 9 8 6 7 2 0) select: [:each | each < 5 ]

zelfs in combinatie met (simpele maar ook zeer complexe) bewerkingen op deze gegevens is dit heel handig:

#(5 4 1 3 9 8 6 7 2 0) select: [:each | each < 5 ] collect: [:each | each + 5 ]
[/code]
Dus dit is zo'n beetje de tegenhanger van Oracle's PL/SQL? Althans, toen ik de titel las dacht ik er meteen aan en nadat ik het artikel gelezen had kreeg ik niet het idee dat het veel anders was...
Alhoewl het idee leuk is, is het 1e wat ik denk nav het voorbeeld, DIT IS GEEN SQL.
sql begint volgens mij altijd mij met een select ( en eindigt er nooit mee ) for kennen ook weinig (/geen ) sql dialecten.

volgens zou het in sql iets zijn als :
select n
from numbers
where n<5;

alhoewel ik zo snel niet kan bedenken hoe ik de enkelvoudige array moet zien, is dit een tabel??? wat is dan de veldnaam...

Edit: Het voorbeeld is mijns inziens gewoon fout. In het origele artikel gaat het volgens mij over dat sql te "anders" is voor echte programmeurs en dat MS dus een .net interface aanbied voor het .net code schrijven ipv sql querys, maar in het voorbeeld hierboven zie ik 1 array die gewoon uitgelezen wordt. Dat die ene array ook vervangen kan worden door een datasource ( alhoewel deze array me al een resultaat uit een ineffeciente query lijkt maarja ) zie ik nergens in het artikel staan.
SQL begint lang niet altijd met een select,

SELECT word slechts gebruikt voor het zoeken, met UPDATE kun je bijvoorbeeld gegevens aanpassen,
INSERT kun je gegevens toeveogen

En zo zijn er nog een stel,
Wederom had ik het verkeerd verwoord, het ging me meer om het gedeelte tussen haakjes. Ik heb nog nooit een SQL dialect gezien waar ik eindigde met een SELECT / UPDATE / INSERT / DELETE statement.
Het ging mij dus puur om het voorbeeld wat op tweakers.net staat. Hier snap ik geen hout van ( het is volgens mij geen sql en geen "goede" procode ) en ik zie dit gepresenteerd worden als de linq taal...
Het is dan ook een nieuwe taal en geen SQL dialect |:(
int numbers is volgens mij een array.
Die lowNums in het voorbeeldje moet je volgens mij zien als een object (denk ik, vanweg die for each daarna) met alle elementen uit array numbers die kleiner zijn dan 5.
Stel je vervangt die numbers door het resultaat van een query, dan kun je er dus wel geinige dingen mee uithalen...
Ik zie anders duidelijk een 'select', 'from' en 'where' -clause terug. Het is misschien geen letterlijke kopie, maar de vorm van filteren is erg identiek:

select <= definieert output
from <= definieert de dataset die gebruikt wordt
where <= conditionele statement (filter)
Hmmm. Dit lijkt toch verdacht veel in het integreren van data in de programmatuur. Toch vreemd voor een Microsoft die al vele jaren propaganda voert voor het scheiden van data, logica en interface. Toch?
Nee. Dit lijkt verdacht veel om het integreren van business logica in je programmatuur. Niks mis mee.

Die array wordt in dit voorbeeld statisch gevuld, maar kan natuurlijk net zo goed ergens anders vandaan komen.
Als een auto fabrikant al jaren propagandavoert voor automaat geschakelde auto's maar de meerderheid van de automobilisten zou een schakelbak willen dan gaat hij toch ook schakelbakken produceren. helemaal niet vreemd toch?
Ik zie een fout in de code. Het lijkt me dat
var lowNums =
int[] lowNums =
moet zijn.
'var' is een legale methode in C# om een lokale variabele als anoniem type te definieren.
Leuk hoor al dat nieuwe spul om programeurs het makkelijker te maken, maar ik vraag me af waarom je dit in hemels naam wilt gebruiken.

Als je niet kan programeren, gebruik dan lekker visual basic ofzo, dan kan je nog mooi door allerlij lagen die het lekker langzaam maken laten oplossen.

Maar laat MS nu aub van C/C++/C# afblijven zodat de mensen die wel kunnen programeren deze onzin allemaal niet nodig hebben niet de nadelen hiervan hebben.
Persoonlijk had ik al een hekel aan C.Net en begin het eigenlijk alleen maar meer te haten.
Currently, the most common way to bring data from databases into an application developed in .Net is through SQL (structured query language). However, SQL uses a completely different vocabulary from languages such as C# and VB that .
Als je als programeur gewoon geen sql kent, zeg dan gewoon "dit kan ik niet maken, mag ik een cursus sql of geef me eerst even een boekje". over het algemeen zijn de sql query's die je in programeer talen gebruikt niet zo moeilijk, ik geef toe dat je in sql hele moeilijke constructies kan maken, maar deze heb je over het algemeen niet nodig.. Ik zeg altijd maar, als je een lang verhaal in commentaar aan het schijven bent hoe geniaal je deze oplossing wel niet vind.... dan heb je iets verkeerds gedaan en moet je het op een andere manier oplossen.

En wat is er mis met "loodgietertje spelen" dat noemen we ook wel "object georienteerd" of "gestructureerd programeren".
In elke programeer taal kan je een spagettie code creeeren, maar maak het de programeurs aub niet nog gemakkelijker om dit te doen!
Als ik een gemiddeld programma binnenkrijg dan is het vaak zo triest gesteld met de structuur dat je vaak denkt "heeft hij uberhaubt eerst even wat schetsen op papier gezet toen hij ging proggen, of is hij direct code gaan kloppen"

Bedankt MS!

edit:
*kijkt even naar het voorbeeld* waarom kan dat niet met de huidige taal?
[code]
int lownumber=5;
int[] numbers = {5,4,1,3,9,8,6,7,2,0};
SortArray(numbers);

//print numbers lower then 5 in sorted array numbers
printf("Numbers <5");
for(int i=0; i<sizeof(numbers);i++){
if(numbers[i]<lownumber)
printf("%d",numbers[i]);
}
[/code]
En jij hebt het dus duidelijk niet begrepen. Je komt over als een verstokte oude programmeur met matching baard en sandalen die niet openstaat voor iets nieuws en al helemaal niet wilt dat het jouw makkelijker wordt gemaakt omdat het anderen dan ook makkelijker wordt gemaakt waardoor er niets meer is om je te onderscheiden van de rest. Man, ga toch assembly coden als je per se ingewikkeld wilt doen.

Een SQL string opbouwen in een programmeertaal is in principe gewoon een crime. Dat is net zoiets als een functie bouwen aan de hand van een string in PHP: evil. Er is geen typesafety, er wordt niets voor je gechecked, en dus is het allemaal nogal error-prone en niet te vergeten: enorm onveilig als je verkeerde dingen doet.

Nu komt MS met een manier om data access op een goede manier te integreren met de programmeertaal, waardoor het al ten eerste onafhankelijk wordt van de datasource (hoeft niet meer per se een RDB te zijn), en ten tweede een stuk handiger wordt in het gebruik omdat je direct je data in de juiste variabele van het juiste type
krijgt. Daarnaast kan je code ťn de query beter geoptimized worden omdat er meer context beschikbaar is voor de compiler.
Het gaat er gewoon om dat je makkelijker door relationele datastructuren kunt wandelen... Heeft ook helemaal niets te maken met SQL Server, zoals robjejansen hierboven doet vermoeden.

LINQ is een eigen taal, die geÔntegreerd wordt met C# (en later met andere .NET talen), waarmee je op 1 manier door vele relationele datastructuren kunt wandelen.

Waar je bijvoorbeeld eerst XPpath/Xslt nodig had om door XML documenten te wandelen, kun je nu LINQ gaan gebruiken.

Onderstaand voorbeeld zal misschien wat meer duidelijkheid geven:


Today one would do this:

XmlDocument doc = new XmlDocument();
XmlElement contacts = doc.CreateElement("contacts");

foreach (Customer c in customers)
if (c.Country == "USA") {
XmlElement e = doc.CreateElement("contact");
XmlElement name = doc.CreateElement("name");
name.InnerText = c.CompanyName;
e.AppendChild(name);
XmlElement phone = doc.CreateElement("phone");
phone.InnerText = c.Phone;
e.AppendChild(phone);
contacts.AppendChild(e);
}
doc.AppendChild(contacts);


In the future, using XLinq one could do this:

XElement contacts = new XElement("contacts",
from c in customers
where c.Country == "USA"
select new XElement("contact",
new XElement("name", c.CompanyName),
new XElement("phone", c.Phone)
)
);
Geweldig!
Ik heb heel vaak dat ik een structuur "in geheugen" heb zitten, en daar alleen bepaalde elementen uit nodig heb.
Nu moet ik dat altijd met een loopje + if-constructie oplossen.

Dit vind ik eigenlijk veel eleganter en duidelijker! :D
hoezo dat?
een foreach... in .. is op assembler niveau exact hetzelfde
alleen nu moet je nog bovenin een semi sql query maken waarop je wilt gaan filteren.

wat is er mis met een for.. if ? dat leest toch lekker weg?
een "voordeel" ervan is dat wel het nu bijvoorbeeld moeilijker te porten is naar een ander platform. heerlijk!
Inderdaad, impliciet uitdrukken wat je hebt (zoals in een SQL) is vaak beter leesbaar en je kan sneller uitdrukken wat je nodig hebt. (zie ook Smalltalk, LISP voor meer expressieve syntax ). Tevens, laat de compiler maar de optimalisatie doen.

Goed kunnen programmeren is leuk, maar "lowlevel" bezig zijn met straightforward "business" code is vragen om problemen. Expressiviteit, snelheid en foutgevoeligheid van de taal zijn elementen die het coden daadwerkelijk kunnen beinvloeden. Met soortgelijke features zullen juist alle programmeurs beter worden.

Op dit item kan niet meer gereageerd worden.



Apple iOS 10 Google Pixel Apple iPhone 7 Sony PlayStation VR AMD Radeon RX 480 4GB Battlefield 1 Google Android Nougat Watch Dogs 2

© 1998 - 2016 de Persgroep Online Services B.V. Tweakers vormt samen met o.a. Autotrack en Carsom.nl de Persgroep Online Services B.V. Hosting door True