sql
c
xml
database
regex
mysql
eclipse
silverlight
flash
html5
json
algorithm
facebook
oracle
cocoa
tsql
delphi
php5
api
postgresql
In my opinion, I usually go for Linq or FetchXml depending for the requirements.
For the Linq: In case for early-bound, I like using Linq because it's strongly typed and It helps much for development speed, but as you stated above, it has its disadvantages.
For the FetchXML: I really love using this magic statement:
EntityCollection result = _serviceProxy.RetrieveMultiple(new FetchExpression(fetch2)); foreach (var c in result.Entities) { System.Console.WriteLine(c.Attributes["name"]); }
Why? Because it's very similar of using the QueryExpression in addition of the aggregation and grouping. The only thing I hate about FetxhXML is that it's hard to build, unlike the Linq.
For building FetchXML queries, I have to open the Advanced-Find then add columns then put my criteria and so on, finally I download it and copy it into my code, and so on.
Finally, the FetchXML has the least limitations among the others.
Regarding the performance I've tried to benchmark between Linq and FetchXML for same query using StopWatch, the result was FetchXML is faster than the Linq.
To build on Anwar's excellent answer focusing on LINQ vs. FetchXml, I'll add I never use QueryExpression. Why?
QueryExpression
LINQ: Queries are built using standard language, but internally uses QueryExpression so is limited to the features of QueryExpression.
QueryExpression: Queries are built as an object model. Supports all the features in FetchXML except for aggregates and grouping.
So it's worse in querying power than FetchXml without the Advanced Find code generation, and it offers the same functionality as the LINQ provider while offering a completely non-standard querying interface (unlike LINQ).
FetchXml
As for LINQ (non)functionality, the limitations of the LINQ provider are clearly, and I think fairly well, documented. Your .Where(x => "b" == x) snippet, for instance, violates the where clause restriction:
.Where(x => "b" == x)
where
where: The left side of the clause must be an attribute name and the right side of the clause must be a value. You cannot set the left side to a constant. Both the sides of the clause cannot be constants.
Not defending Microsoft: they need to put in a lot of work on the LINQ provider (read: direct-to-SQL provider) before the LINQ provider is professional grade, but hey, at least they've got a great disclaimer.
I've been asked specifically by a client to use the Query Expression model, so in order to make my life easier, I've resorted to adding a lot of extension methods to IOrganizationService. Examples Include:
public static List<T> GetEntities<T>( this IOrganizationService service, params object[] columnNameAndValuePairs ) where T : Entity
which converts the params object[] and T entity type into a query expression, and automatically returns the results to an entity list. So it is used like so:
foreach(var c in service.GetEntities<Contact>("lastname", "Doe", "firstname", "Smith")) { ... }
I also use this one a lot too:
public static T GetFirstOrDefault<T>( this IOrganizationService service, params object[] columnNameAndValuePairs ) where T : Entity var c = service.GetFirstOrDefault<Contact>("owner", id);
These type of extension methods make working with query expressions a lot easier, giving you a much more LINQ type style, without weird linq restriction traps that are easy to fall into.