Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extension methods syntax vs query syntax

I'm trying to get a handle on if there's a good time to use standard linq keywords or linq extension methods with lambda expressions. They seems to do the same thing, just are written differently. Is it purely a matter of style?

var query = from p in Products     where p.Name.Contains("foo")     orderby c.Name     select p;  // or with extension methods: var query = Products     .Where(p => p.Name.Contains("foo"))     .OrderBy(p => p.Name); 

They're very similar with the second example being a bit more terse, but perhaps less expressive if you don't know what the => is doing.

Other than writing terse code, are there other advantages to using the extension methods as opposed to the LINQ syntax?

like image 692
Armstrongest Avatar asked Nov 11 '08 00:11

Armstrongest


People also ask

What is query syntax and method syntax?

Query syntax and method syntax are semantically identical, but many people find query syntax simpler and easier to read. Some queries must be expressed as method calls. For example, you must use a method call to express a query that retrieves the number of elements that match a specified condition.

What is query syntax?

LINQ query syntax is consist of a set of query keywords defined into the . NET Framework version 3.5 or Higher. This allows the programmer or developers to write the commands similar to SQL style in the code(C# or VB.NET) without using quotes. It is also know as the Query Expression Syntax.

What is meant by extension method?

Extension methods enable you to "add" methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type. Extension methods are static methods, but they're called as if they were instance methods on the extended type.

What is method syntax?

Method syntax (also known as fluent syntax) uses extension methods included in the Enumerable or Queryable static class, similar to how you would call the extension method of any class. The compiler converts query syntax into method syntax at compile time.


1 Answers

Honestly, sometimes it can be situational once you start using Funcs and Actions. Say you are using these three funcs:

  Func<DataClasses.User, String> userName = user => user.UserName;   Func<DataClasses.User, Boolean> userIDOverTen = user => user.UserID < 10;   Func<DataClasses.User, Boolean> userIDUnderTen = user => user.UserID > 10; 

As you can see the first one replaces the lamdba expression to get the user name, the second replaces a lamdba expression used to check if the ID is lower than 10, and let's face it, the third should be pretty easy to understand now.

NOTE: This is a silly example but it works.

  var userList =      from user in userList     where userIDOverTen(user)     select userName; 

Versus

  var otherList =     userList     .Where(IDIsBelowNumber)     .Select(userName) 

In this example, the second is a little less verbose since the extension method can make full use of the Func, but he Linq expression can't since it is look just for a Boolean rather than a Func that returns boolean. However, this is where it might be better to use the expression language. Say you already had a method that takes in more than just a user:

  private Boolean IDIsBelowNumber(DataClasses.User user,            Int32 someNumber, Boolean doSomething)   {     return user.UserID < someNumber;   } 

Note: doSomething is just there because of the where extension method being ok with a method that takes in a user and integer and returns boolean. Kind of annoying for this example.

Now if you look at the Linq query:

  var completeList =      from user in userList      where IDIsBelowNumber(user, 10, true)      select userName; 

You're good for it. Now the Extension Method:

  var otherList =     userList     .Where(IDIsBelowNumber????)     .Select(userName) 

Without a lambda expression, I really can't call that method. So now what I have to do is create a method that creates a Func based off the original method call.

   private Func<DataClasses.User, Boolean> IDIsBelowNumberFunc(Int32 number)    {       return user => IDIsBelowNumber(user, number, true);    } 

And then plug it in:

  var otherList =      userList      .Where(IDIsBelowNumberFunc(10))      .Select(userName) 

So you can see, sometimes it may just be easier to use the query approach at times.

like image 101
Programmin Tool Avatar answered Oct 06 '22 01:10

Programmin Tool