You should think about it in terms of an expression tree, namely, how Linq-to-SQL parses your query to turn it into SQL.
When examining the tree, he will see a DateTime object, and then checks if the method called on it is one of the supported AddHours ( Add , AddHours , etc.), so when you use the method directly, it works fine.
When you use any other extension method, it cannot go and look inside this method to see what it does, since information about this method is not in the expression tree, it is hidden in IL. Therefore, it does not matter if the contents of the extension method are supported, since Linq-to-SQL cannot determine what the content is.
The point of creating methods is encapsulating and hiding information, which usually works well in application development, but, unfortunately, here it hides the information from Linq-to-SQL that you need to view the information.
In response to an edited question - how do you solve this? If you want to keep the date calculation in a Linq expression, the only thing you can do to efficiently execute the query is not to use the extension method and just use AddHours(3) directly in the DateTime object.
This is one of Linq's unfortunate limitations. Like many things, this is a slightly leaking abstraction, which, while providing a common syntax for a number of sources, has various limitations and restrictions by which operators supporting the source can / will support (for example, this will work fine in Linq-to -Objects, since you donβt need to translate the expression tree to execute it).