Sunday, October 30, 2011

SQL to LINQ

                             It is difficult to write queries in LINQ (Language Integrate Natural query) in the first attempt but relating it with the language you used for writing queries will make your task reduce by 50% as you only now  need to know the syntax; and learning it wont be difficult.
                            There are number of advantages you can take it by writing your queries in LINQ,, they are as follows:

1. Makes it easier to transform data into objects. I'm sure you've heard the term "Impedence Mismatch" being used quite often, meaning that LINQ reduces the amount of work you must do to translate between object-oriented code and data paradigms such as hierarchical, flat-file, messages, relational, and more.  It doesn't eliminate the "Impedence Mismatch" because you must still reason about your data in its native form, but the bridge from here to there is (IMO) much shorter.


2. A common syntax for all data. Once you learn query syntax, you can use it with any LINQ provider. I think this is a much better development paradigm than the Tower of Babel that has grown over the years with data access technologies. Of course, each LINQ provider has unique nuances that are necessary, but the basic approach and query syntax is the same.


3. Strongly typed code.  The C# (or VB.NET) query syntax is part of the language and you code with C# types, which are translated into something a provider understands. This means that you gain the productivity of having your compiler find errors earlier in the development lifecycle than elsewhere. Granted, many errors in stored proc syntax will generate errors when you save, but LINQ is more general than SQL Server. You have to think of all the other types of data sources that generate runtime errors because their queries are formed with strings or some other loosely typed mechanism.


4. Provider integration. Pulling together data sources is very easy. For example, you can use LINQ to Objects, LINQ to SQL, and LINQ to XML together for some very sophisticated scenarios. I think it's very elegant.


5. Reduction in work.  Before LINQ, I spent a lot of time building DALs, but now my DataContext is the DAL.  I've used OPFs too, but now I have LINQ that ships with multiple providers in the box and many other 3rd party providers, giving me the benefits from my previous points.  I can set up a LINQ to SQL DataContext in a minute (as fast as my computer and IDE can keep up).



6. Performance in the general case doesn't become an issue. SQL Server optimizes queries quite well these days, just like stored procs.  Of course, there are still cases where stored procs are necessary for performance reasons.  For example, I've found it smarter to use a stored proc when I had multiple interactions between tables with additional logic inside of a transaction. The communications overhead of trying to do the same task in code, in addition to getting the DTC involved in a distributed transaction made the choice for a stored proc more compelling. However, for a query that executes in a single statement, LINQ is my preferred choice because even if there was a small performance gain from a stored proc, the benefits in previous points (IMO) carry more weight.

7. Built-in security. One reason I preferred stored procs before LINQ was that they forced the use of parameters, helping to reduce SQL injection attacks. LINQ to SQL already parameterizes input, which is just as secure.

8. LINQ is declarative.  A lot of attention is paid to working with LINQ to XML or LINQ to SQL, but LINQ to Objects is incredibly powerful.  A typical example of LINQ to Objects is reading items from a string[].  However, that's just a small example.  If you think about all of the IEnumerable collections (you can also query IEnumerable) that you work with every day, the opportunities are plentiful.  i.e. Searching an ASP.NET ListBox control for selected items, performing set operations (such as Union) on two collections, or iterating through a List and running a lambda in a ForEach of each item.  Once you begin to think in LINQ, which is declarative in nature, you can find many of your tasks to be simpler and more intuitive than the imperative techniques you use today.
Too much theory lets now jump into writing queries in SQL and equivalent query in LINQ:

1. SELECT Queries:
a. SQL : 
              SELECT *  
              FROM TableName;
b. LINQ : 
               FROM AliasName in ConnectionStringObjectName.TableName
               SELECT new { AliasName };

2. SELECT Specific Columns Queries: 
a. SQL :
             SELECT Column1], [Column2], [Column3] 
             FROM TableName;
b. LINQ :
              FROM AliasName in ConnectionStringObjectName.TableName
             SELECT new { AliasName.Column1, AliasName,Column2, AliasName.Column3};

3. Using WHERE Clause:
a. SQL : 
             SELECT *
             FROM TableName
             WHERE [ColumnName] = Value;
b. LINQ : 
                FROM AliasName in ConnectionStringObjectName.TableName
                WHERE AliasName.ColumnName=Value
                SELECT new {AliasName};

4. Count Queries:
a. SQL :
              SELECT COUNT(*) AS AliasName
              FROM TableName;
b. LINQ :
               (FROM AliasName in ConnectionStringObjectName.TableName
               SELECT AliasName).COUNT();

No comments:

Post a Comment