views:

918

answers:

6

How would you rate each of them in terms of:

  1. Performance
  2. Speed of development
  3. Neat, intuitive, maintainable code
  4. Flexibility
  5. Overall

I like my SQL and so have always been a die-hard fan of ADO.NET and stored procedures but I recently had a play with Linq to SQL and was blown away by how quickly I was writing out my DataAccess layer and have decided to spend some time really understanding either Linq to SQL or EF... or neither?

I just want to check, that there isn't a great flaw in any of these technologies that would render my research time useless. E.g. performance is terrible, it's cool for simple apps but can only take you so far.

Update: Can you concentrate on EF VS L2S VS SPs rather than ORM VS SPs. I'm mainly interested by EF VS L2S. But am keen to have them compared against stored procs too since plain SQl is something I know a lot about.

+3  A: 

LINQ-to-SQL is a remarkable piece of technology that is very simple to use, and by and large generates very good queries to the back end. LINQ-to-EF was slated to supplant it, but historically has been extremely clunky to use and generated far inferior SQL. I don't know the current state of affairs, but Microsoft promised to migrate all the goodness of L2S into L2EF, so maybe it's all better now.

Personally, I have a passionate dislike of ORM tools (see my diatribe here for the details), and so I see no reason to favour L2EF, since L2S gives me all I ever expect to need from a data access layer. In fact, I even think that L2S features such as hand-crafted mappings and inheritance modeling add completely unnecessary complexity. But that's just me. ;-)

Marcelo Cantos
L2S is pretty good, but has the downside that Microsoft have stated that they're basically not going to invest much in extending it. You can see the results of this already in the latest version which only has a few bug fixes and some support for SQL Server 2008 datatypes added.
FinnNk
Agreed, @FinnNk. It's an unfortunate reality that using L2S is somewhat risky due to it's pariah status. But if they really did fob it off completely in favour of L2EF, I strongly suspect there would be a migration path, due the following it still enjoys.
Marcelo Cantos
Linq to EF has matured, and now produces SQL as good as L2S (as of .NET 4.0). L2EF is a lot nicer than L2S nowadays, since it at least can update your model as the DB changes, which L2S could never do automatically. I also like the fact that you can map simple M:M relationships with EF as relationships without needing to have an intermediate entity. It makes the code that much cleaner.
Dave Markle
Thanks for the update @Dave. I disagree with the M:M comment, however. The schemas I've worked with almost always grow extra attributes on join tables. This induces a structural change to the object model, requiring a lot of code rework. I would much rather deal with the intermediate relation explicitly from the outset.
Marcelo Cantos
@Marcelo: it would be interesting to see if they did anything to mitigate that issue. I haven't delved that deep into EF yet, being a linq to sql devotee.
Dave Markle
+3  A: 

Stored procedures:

(++)

  • Great flexibility
  • Full control over SQL
  • The highest performance available

(--)

  • Requires knowledge of SQL
  • Stored procedures are out of source control
  • Substantial amount of "repeating yourself" while specifying the same table and field names. The high chance of breaking the application after renaming a DB entity and missing some references to it somewhere.
  • Slow development

ORM:

(+)

  • Rapid development
  • Data access code now under source control
  • You're isolated from changes in DB. If that happens you only need to update your model/mappings in one place.

(-)

  • Performance may be worse
  • No or little control over SQL the ORM produces (could be inefficient or worse buggy). Might need to intervene and replace it with custom stored procedures. That will render your code messy (some LINQ in code, some SQL in code and/or in the DB out of source control).
  • As any abstraction can produce "high-level" developers having no idea how it works under the hood

The general tradeoff is between having a great flexibility and losing lots of time vs. being restricted in what you can do but having it done very quickly.

There is no general answer to this question. It's a matter of holy wars. Also depends on a project at hand and your needs. Pick up what works best for you.

Developer Art
comments with downvotes are polite, what is the problem with this answer?
David
+5  A: 

your question is basically O/RM's vs hand writing SQL

http://stackoverflow.com/questions/494816/using-an-orm-or-plain-sql

Take a look at some of the other O/RM solutions out there, L2S isn't the only one (NHibernate, ActiveRecord)

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software

to address the specific questions:

  1. Depends on the quality of the O/RM solution, L2S is pretty good at generating SQL
  2. This is normally much faster using an O/RM once you grok the process
  3. Code is also usually much neater and more maintainable
  4. Straight SQL will of course get you more flexibility, but most O/RM's can do all but the most complicated queries
  5. Overall I would suggest going with an O/RM, the flexibility loss is negligable
David
@David Thanks, but it is not ORM vs SQL. I am looking to move to ORM and am wondering which to invest time in learning: EF or L2S (unless they are rubbish compared to Stored Procs)
BritishDeveloper
I'd definitely say they're not rubbish compared to stored procs, and a side benefit is that you don't have code spread to the database. Personally I like L2S, but I haven't done much with EF at this point, and it appears that L2EF is going to supplant it, so I'd go EF. Also, once you go Linq, you don't go back.
David
+11  A: 

First off, if you're starting a new project, go with Entity Framework on .NET 4.0 - it now generates much better SQL (more like Linq to SQL does) and is easier to maintain and more powerful than Linq to SQL. As of the release of .NET 4.0, I consider Linq to SQL to be an obsolete technology. MS has been very open about not continuing L2S development further.

1) Performance

This is tricky to answer. For most single-entity operations (CRUD) you will find just about equivalent performance with all three technologies. You do have to know how EF and Linq to SQL work in order to use them to their fullest. For high-volume operations like polling queries, you may want to have EF/L2S "compile" your entity query such that the framework doesn't have to constantly regenerate the SQL, or you can run into scalability issues.

For bulk updates where you're updating massive amounts of data, raw SQL or a stored procedure will always perform better than an ORM solution because you don't have to marshal the data over the wire to the ORM to perform the update.

2) Speed of Development

In most scenarios, EF will blow away naked SQL/stored procs when it comes to speed of development. The EF designer can update your model from your database as it changes (upon request), so you don't run into synchronization issues between your object code and your database code. The only time I would not consider using an ORM is when you're doing a reporting/dashboard type application where you aren't doing any updating, or when you're creating an application just to do raw data maintenance operations on a database.

3) Neat/Maintainable code

Hands down, EF beats SQL/sprocs. Because your relationships are modeled, joins in your code are relatively infrequent. The relationships of the entities are almost self-evident to the reader for most queries. Nothing is worse than having to go from tier to tier debugging or through multiple SQL/middle tier in order to understand what's actually happening to your data. EF brings your data model into your code in a very powerful way.

4) Flexibility

Stored procs and raw SQL are more "flexible". You can leverage sprocs and SQL to generate faster queries for the odd specific case, and you can leverage native DB functionality easier than you can with and ORM.

5) Overall

Don't get caught up in the false dichotomy of choosing an ORM vs using stored procedures. You can use both in the same application, and you probably should. Big bulk operations should go in stored procedures or SQL (which can actually be called by the EF), and EF should be used for your CRUD operations and most of your middle-tier's needs. Perhaps you'd choose to use SQL for writing your reports. I guess the moral of the story is the same as it's always been. Use the right tool for the job. But the skinny of it is, EF is very good nowadays (as of .NET 4.0). Spend some real time reading and understanding it in depth and you can create some amazing, high-performance apps with ease.

Dave Markle
Absolutely brilliant answer. I am now indeed using EF to speedily develop an app. If performance becomes an issue, stored procs will be brought in to refactor the badly performing EF queries. Thanks!
BritishDeveloper
@BritishDeveloper: Also, don't forget the power of using views as well. We've had great success with defining a couple of views in our L2S projects and leveraging them where the framework is seeming to write poor queries. That way, we get all of the benefits of using the framework with all of the benefits of writing our own SQL.
Dave Markle
@Dave: I am also using Views ;) More as a work around for the non-cross db limitation of EF. Good idea for use for optimisation though. Thanks
BritishDeveloper
Definitely a great response. Just wanted to add an observation I had in my own experience with L2S vs EF4. Swapped from L2S -> EF4 after we realized we may be using several differnet RDMBS... but, while still running MSSQL the performance drop showed mainly in the GUI area of my app. Databinding to the resultset in L2S was much faster than EF4. It's the exact same query on the exact same DB. One thing to note here though is I'm returning 90k+ records so the difference was pretty obvious. Maybe on smaller sets it's not a problem? Not sure how it would scale though with high vol sites...
bbqchickenrobot
+1  A: 

I think EF is considered to be more suitable for Enterprise solutions when LINQ to SQL is better for smaller solutions.

I like EF for its support of Stored Procedures for inserting/updating/deletion of entities. (I'm using this T4 template to generate them from the .edmx file)

Regent
A: 

You can't beat pure ADO.NET (with stored procedures) in terms of perfromance. Check performance scorecard here: http://ormbattle.net/

Tomi