Why would you use Expression<Func> rather than Func?











up vote
807
down vote

favorite
310












I understand lambdas and the Func and Action delegates. But expressions stump me. In what circumstances would you use an Expression<Func<T>> rather than a plain old Func<T>?










share|improve this question




















  • 8




    Func<> will be converted to a method on the c# compiler level ,Expression<Func<>> will be executed on the MSIL level after compiling the code directly, that is the reason it is faster
    – Waleed A.K.
    Aug 28 '16 at 18:05










  • in addition to the answers, the csharp language specification "4.6 expression tree types" is helpful to cross reference
    – djeikyb
    Dec 4 '17 at 23:51















up vote
807
down vote

favorite
310












I understand lambdas and the Func and Action delegates. But expressions stump me. In what circumstances would you use an Expression<Func<T>> rather than a plain old Func<T>?










share|improve this question




















  • 8




    Func<> will be converted to a method on the c# compiler level ,Expression<Func<>> will be executed on the MSIL level after compiling the code directly, that is the reason it is faster
    – Waleed A.K.
    Aug 28 '16 at 18:05










  • in addition to the answers, the csharp language specification "4.6 expression tree types" is helpful to cross reference
    – djeikyb
    Dec 4 '17 at 23:51













up vote
807
down vote

favorite
310









up vote
807
down vote

favorite
310






310





I understand lambdas and the Func and Action delegates. But expressions stump me. In what circumstances would you use an Expression<Func<T>> rather than a plain old Func<T>?










share|improve this question















I understand lambdas and the Func and Action delegates. But expressions stump me. In what circumstances would you use an Expression<Func<T>> rather than a plain old Func<T>?







c# delegates lambda expression-trees






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Apr 27 '09 at 14:36









Mehrdad Afshari

340k75774752




340k75774752










asked Apr 27 '09 at 13:50









Richard Nagle

4,28431616




4,28431616








  • 8




    Func<> will be converted to a method on the c# compiler level ,Expression<Func<>> will be executed on the MSIL level after compiling the code directly, that is the reason it is faster
    – Waleed A.K.
    Aug 28 '16 at 18:05










  • in addition to the answers, the csharp language specification "4.6 expression tree types" is helpful to cross reference
    – djeikyb
    Dec 4 '17 at 23:51














  • 8




    Func<> will be converted to a method on the c# compiler level ,Expression<Func<>> will be executed on the MSIL level after compiling the code directly, that is the reason it is faster
    – Waleed A.K.
    Aug 28 '16 at 18:05










  • in addition to the answers, the csharp language specification "4.6 expression tree types" is helpful to cross reference
    – djeikyb
    Dec 4 '17 at 23:51








8




8




Func<> will be converted to a method on the c# compiler level ,Expression<Func<>> will be executed on the MSIL level after compiling the code directly, that is the reason it is faster
– Waleed A.K.
Aug 28 '16 at 18:05




Func<> will be converted to a method on the c# compiler level ,Expression<Func<>> will be executed on the MSIL level after compiling the code directly, that is the reason it is faster
– Waleed A.K.
Aug 28 '16 at 18:05












in addition to the answers, the csharp language specification "4.6 expression tree types" is helpful to cross reference
– djeikyb
Dec 4 '17 at 23:51




in addition to the answers, the csharp language specification "4.6 expression tree types" is helpful to cross reference
– djeikyb
Dec 4 '17 at 23:51












9 Answers
9






active

oldest

votes

















up vote
993
down vote



accepted










When you want to treat lambda expressions as expression trees and look inside them instead of executing them. For example, LINQ to SQL gets the expression and converts it to the equivalent SQL statement and submits it to server (rather than executing the lambda).



Conceptually, Expression<Func<T>> is completely different from Func<T>. Func<T> denotes a delegate which is pretty much a pointer to a method and Expression<Func<T>> denotes a tree data structure for a lambda expression. This tree structure describes what a lambda expression does rather than doing the actual thing. It basically holds data about the composition of expressions, variables, method calls, ... (for example it holds information such as this lambda is some constant + some parameter). You can use this description to convert it to an actual method (with Expression.Compile) or do other stuff (like the LINQ to SQL example) with it. The act of treating lambdas as anonymous methods and expression trees is purely a compile time thing.



Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }


will effectively compile to an IL method that gets nothing and returns 10.



Expression<Func<int>> myExpression = () => 10;


will be converted to a data structure that describes an expression that gets no parameters and returns the value 10:



Expression vs Funclarger image



While they both look the same at compile time, what the compiler generates is totally different.






share|improve this answer



















  • 75




    So, in other words, an Expression contains the meta-information about a certain delegate.
    – bertl
    Feb 25 '15 at 13:37






  • 33




    @bertl Actually, no. The delegate is not involved at all. The reason there's any association at all with a delegate is that you can compile the expression to a delegate - or to be more precise, compile it to a method and get the delegate to that method as a return value. But the expression tree itself is just data. The delegate does not exist when you use Expression<Func<...>> instead of just Func<...>.
    – Luaan
    Jun 16 '15 at 20:15






  • 2




    You're absolutely right @Luaan. I did not mean to create any artificial relationship between Expressions and delegates. My point was related to the original question, i.e. "What does an Expression<Func<T>> have and a Func<T> not?" I just wanted to summarize the accepted answer in a very brief manner; it may sound a little oversimplified, though.
    – bertl
    Jun 17 '15 at 6:26






  • 5




    @Kyle Delaney (isAnExample) => { if(isAnExample) ok(); else expandAnswer(); } such expression is an ExpressionTree, branches are created for the If-statement.
    – Matteo Marciano - MSCP
    Jan 20 '17 at 14:47








  • 2




    @bertl Delegate is what CPU sees (executable code of one architecture), Expression is what compiler sees (merely another format of source code, but still source code).
    – codewarrior
    May 5 '17 at 9:22




















up vote
235
down vote













I'm adding an answer-for-noobs because these answers seemed over my head, until I realized how simple it is. Sometimes it's your expectation that it's complicated that makes you unable to 'wrap your head around it'.



I didn't need to understand the difference until I walked into a really annoying 'bug' trying to use LINQ-to-SQL generically:



public IEnumerable<T> Get(Func<T, bool> conditionLambda){
using(var db = new DbContext()){
return db.Set<T>.Where(conditionLambda);
}
}


This worked great until I started getting OutofMemoryExceptions on larger datasets. Setting breakpoints inside the lambda made me realize that it was iterating through each row in my table one-by-one looking for matches to my lambda condition. This stumped me for a while, because why the heck is it treating my data table as a giant IEnumerable instead of doing LINQ-to-SQL like it's supposed to? It was also doing the exact same thing in my LINQ-to-MongoDb counterpart.



The fix was simply to turn Func<T, bool> into Expression<Func<T, bool>>, so I googled why it needs an Expression instead of Func, ending up here.



An expression simply turns a delegate into a data about itself. So a => a + 1 becomes something like "On the left side there's an int a. On the right side you add 1 to it." That's it. You can go home now. It's obviously more structured than that, but that's essentially all an expression tree really is--nothing to wrap your head around.



Understanding that, it becomes clear why LINQ-to-SQL needs an Expression, and a Func isn't adequate. Func doesn't carry with it a way to get into itself, to see the nitty-gritty of how to translate it into a SQL/MongoDb/other query. You can't see whether it's doing addition or multiplication on subtraction. All you can do is run it. Expression, on the other hand, allows you to look inside the delegate and see everything it's wanting to do, empowering you to translate it into whatever you want, like a SQL query. Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table.



Edit: expounding on my last sentence at John Peter's request:



IQueryable extends IEnumerable, so IEnumerable's methods like Where() obtain overloads that accept Expression. When you pass an Expression to that, you keep an IQueryable as a result, but when you pass a Func, you're falling back on the base IEnumerable and you'll get an IEnumerable as a result. In other words, without noticing you've turned your dataset into a list to be iterated as opposed to something to query. It's hard to notice a difference until you really look under the hood at the signatures.






share|improve this answer



















  • 1




    Chad; Please explain this comment a bit more: "Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table."
    – John Peters
    Oct 3 '16 at 23:03






  • 5




    This is far most best answer I read in this SO thread. Thank you sir!
    – Teoman shipahi
    Nov 7 '16 at 17:26






  • 1




    For all the noobs out there thanks a lot
    – Etienne
    Nov 22 '16 at 3:50






  • 1




    Thanks for explaining different behavior when passing Expression vs Func. It's extremely important to know!!
    – Reverove Likia
    Nov 29 '16 at 15:27






  • 3




    Great answer, thank you! This should get a lot more upvotes!
    – j00hi
    Jan 9 '17 at 9:20


















up vote
94
down vote













An extremely important consideration in the choice of Expression vs Func is that IQueryable providers like LINQ to Entities can 'digest' what you pass in an Expression, but will ignore what you pass in a Func. I have two blog posts on the subject:



More on Expression vs Func with Entity Framework and
Falling in Love with LINQ - Part 7: Expressions and Funcs (the last section)






share|improve this answer





















  • +l for explanation. However I get 'The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.' and had to use ForEach after fetching the results.
    – tymtam
    Apr 29 '13 at 4:52


















up vote
61
down vote













I'd like to add some notes about the differences between Func<T> and Expression<Func<T>>:





  • Func<T> is just a normal old-school MulticastDelegate;


  • Expression<Func<T>> is a representation of lambda expression in form of expression tree;

  • expression tree can be constructed through lambda expression syntax or through the API syntax;

  • expression tree can be compiled to a delegate Func<T>;

  • the inverse conversion is theoretically possible, but it's a kind of decompiling, there is no builtin functionality for that as it's not a straightforward process;

  • expression tree can be observed/translated/modified through the ExpressionVisitor;

  • the extension methods for IEnumerable operate with Func<T>;

  • the extension methods for IQueryable operate with Expression<Func<T>>.


There's an article which describes the details with code samples:
LINQ: Func<T> vs. Expression<Func<T>>.



Hope it will be helpful.






share|improve this answer























  • Nice list, one small note is you mention that the inverse conversion is possible, however an exact inverse is not. Some metadata is lost during the conversion process. However you could decompile it to an Expression tree that produces the same result when compiled again.
    – Aidiakapi
    Mar 13 '15 at 19:43


















up vote
53
down vote













There is a more philosophical explanation about it from Krzysztof Cwalina's book(Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries);




Rico Mariani




Edit for non-image version:




Most times you're going to want Func or Action if all that needs to happen is to run some code. You need Expression when the code needs to be analyzed, serialized, or optimized before it is run. Expression is for thinking about code, Func/Action is for running it.







share|improve this answer



















  • 7




    Well put. ie. You need expression when you are expecting your Func to be converted into some sort of query. Ie. you need database.data.Where(i => i.Id > 0) to be executed as SELECT FROM [data] WHERE [id] > 0. If you just pass in a Func, you've put blinders on your driver and all it can do is SELECT * and then once it's loaded all of that data into memory, iterate through each and filter out everything with id > 0. Wrapping your Func in Expression empowers the driver to analyze the Func and turn it into a Sql/MongoDb/other query.
    – Chad Hedgcock
    Mar 26 '16 at 3:59










  • the link doesn't seem to work
    – Kcats Wolfrevo
    Sep 21 '17 at 10:10










  • @KcatsWolfrevo edited for non image version.
    – Oğuzhan Soykan
    Oct 11 '17 at 18:02










  • So when i am planning for a Vacation, I would use Expression but when I am ON vacation it will be Func/Action ;)
    – GoldBishop
    Nov 7 '17 at 19:42


















up vote
34
down vote













LINQ is the canonical example (for example, talking to a database), but in truth, any time you care more about expressing what to do, rather than actually doing it. For example, I use this approach in the RPC stack of protobuf-net (to avoid code-generation etc) - so you call a method with:



string result = client.Invoke(svc => svc.SomeMethod(arg1, arg2, ...));


This deconstructs the expression tree to resolve SomeMethod (and the value of each argument), performs the RPC call, updates any ref/out args, and returns the result from the remote call. This is only possible via the expression tree. I cover this more here.



Another example is when you are building the expression trees manually for the purpose of compiling to a lambda, as done by the generic operators code.






share|improve this answer






























    up vote
    18
    down vote













    You would use an expression when you want to treat your function as data and not as code. You can do this if you want to manipulate the code (as data). Most of the time if you don't see a need for expressions then you probably don't need to use one.






    share|improve this answer




























      up vote
      15
      down vote













      The primary reason is when you don't want to run the code directly, but rather, want to inspect it. This can be for any number of reasons:




      • Mapping the code to a different environment (ie. C# code to SQL in Entity Framework)

      • Replacing parts of the code in runtime (dynamic programming or even plain DRY techniques)

      • Code validation (very useful when emulating scripting or when doing analysis)

      • Serialization - expressions can be serialized rather easily and safely, delegates can't

      • Strongly-typed safety on things that aren't inherently strongly-typed, and exploiting compiler checks even though you're doing dynamic calls in runtime (ASP.NET MVC 5 with Razor is a nice example)






      share|improve this answer





















      • can you elaborate a bit more on no.5
        – uowzd01
        Oct 25 '15 at 23:09










      • @uowzd01 Just look at Razor - it uses this approach extensively.
        – Luaan
        Oct 26 '15 at 8:04










      • @Luaan I am looking for expression serializations but not able to find anything without a limited third party usage. Does .Net 4.5 support expression tree serialization?
        – vabii
        Dec 12 '17 at 19:27










      • @vabii Not that I know of - and it wouldn't really be a good idea for the general case. My point was more about you being able to write pretty simple serialization for the specific cases you want to support, against interfaces designed ahead of time - I've done just that a few times. In the general case, an Expression can be just as impossible to serialize as a delegate, since any expression can contain an invocation of an arbitrary delegate/method reference. "Easy" is relative, of course.
        – Luaan
        Dec 13 '17 at 14:30










      • @Luaan Thanks for clarifying.
        – vabii
        Dec 13 '17 at 16:07


















      up vote
      7
      down vote













      I don't see any answers yet that mention performance. Passing Func<>s into Where() or Count() is bad. Real bad. If you use a Func<> then it calls the IEnumerable LINQ stuff instead of IQueryable, which means that whole tables get pulled in and then filtered. Expression<Func<>> is significantly faster, especially if you are querying a database that lives another server.






      share|improve this answer





















      • Does this apply to in-memory query as well?
        – stt106
        Jan 4 at 15:18










      • @stt106 Probably not.
        – mhenry1384
        Jan 6 at 2:54










      • This is only true if you enumerate the list. If you use GetEnumerator or foreach you will not load the ienumerable fully into memory.
        – nelsontruran
        Apr 23 at 20:17






      • 1




        @stt106 When passed to the .Where() clause of a List<>, Expression<Func<>> gets .Compile() called on it, so Func<> is almost certainly faster. See referencesource.microsoft.com/#System.Core/System/Linq/…
        – NStuke
        Aug 1 at 18:43











      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f793571%2fwhy-would-you-use-expressionfunct-rather-than-funct%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      9 Answers
      9






      active

      oldest

      votes








      9 Answers
      9






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes








      up vote
      993
      down vote



      accepted










      When you want to treat lambda expressions as expression trees and look inside them instead of executing them. For example, LINQ to SQL gets the expression and converts it to the equivalent SQL statement and submits it to server (rather than executing the lambda).



      Conceptually, Expression<Func<T>> is completely different from Func<T>. Func<T> denotes a delegate which is pretty much a pointer to a method and Expression<Func<T>> denotes a tree data structure for a lambda expression. This tree structure describes what a lambda expression does rather than doing the actual thing. It basically holds data about the composition of expressions, variables, method calls, ... (for example it holds information such as this lambda is some constant + some parameter). You can use this description to convert it to an actual method (with Expression.Compile) or do other stuff (like the LINQ to SQL example) with it. The act of treating lambdas as anonymous methods and expression trees is purely a compile time thing.



      Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }


      will effectively compile to an IL method that gets nothing and returns 10.



      Expression<Func<int>> myExpression = () => 10;


      will be converted to a data structure that describes an expression that gets no parameters and returns the value 10:



      Expression vs Funclarger image



      While they both look the same at compile time, what the compiler generates is totally different.






      share|improve this answer



















      • 75




        So, in other words, an Expression contains the meta-information about a certain delegate.
        – bertl
        Feb 25 '15 at 13:37






      • 33




        @bertl Actually, no. The delegate is not involved at all. The reason there's any association at all with a delegate is that you can compile the expression to a delegate - or to be more precise, compile it to a method and get the delegate to that method as a return value. But the expression tree itself is just data. The delegate does not exist when you use Expression<Func<...>> instead of just Func<...>.
        – Luaan
        Jun 16 '15 at 20:15






      • 2




        You're absolutely right @Luaan. I did not mean to create any artificial relationship between Expressions and delegates. My point was related to the original question, i.e. "What does an Expression<Func<T>> have and a Func<T> not?" I just wanted to summarize the accepted answer in a very brief manner; it may sound a little oversimplified, though.
        – bertl
        Jun 17 '15 at 6:26






      • 5




        @Kyle Delaney (isAnExample) => { if(isAnExample) ok(); else expandAnswer(); } such expression is an ExpressionTree, branches are created for the If-statement.
        – Matteo Marciano - MSCP
        Jan 20 '17 at 14:47








      • 2




        @bertl Delegate is what CPU sees (executable code of one architecture), Expression is what compiler sees (merely another format of source code, but still source code).
        – codewarrior
        May 5 '17 at 9:22

















      up vote
      993
      down vote



      accepted










      When you want to treat lambda expressions as expression trees and look inside them instead of executing them. For example, LINQ to SQL gets the expression and converts it to the equivalent SQL statement and submits it to server (rather than executing the lambda).



      Conceptually, Expression<Func<T>> is completely different from Func<T>. Func<T> denotes a delegate which is pretty much a pointer to a method and Expression<Func<T>> denotes a tree data structure for a lambda expression. This tree structure describes what a lambda expression does rather than doing the actual thing. It basically holds data about the composition of expressions, variables, method calls, ... (for example it holds information such as this lambda is some constant + some parameter). You can use this description to convert it to an actual method (with Expression.Compile) or do other stuff (like the LINQ to SQL example) with it. The act of treating lambdas as anonymous methods and expression trees is purely a compile time thing.



      Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }


      will effectively compile to an IL method that gets nothing and returns 10.



      Expression<Func<int>> myExpression = () => 10;


      will be converted to a data structure that describes an expression that gets no parameters and returns the value 10:



      Expression vs Funclarger image



      While they both look the same at compile time, what the compiler generates is totally different.






      share|improve this answer



















      • 75




        So, in other words, an Expression contains the meta-information about a certain delegate.
        – bertl
        Feb 25 '15 at 13:37






      • 33




        @bertl Actually, no. The delegate is not involved at all. The reason there's any association at all with a delegate is that you can compile the expression to a delegate - or to be more precise, compile it to a method and get the delegate to that method as a return value. But the expression tree itself is just data. The delegate does not exist when you use Expression<Func<...>> instead of just Func<...>.
        – Luaan
        Jun 16 '15 at 20:15






      • 2




        You're absolutely right @Luaan. I did not mean to create any artificial relationship between Expressions and delegates. My point was related to the original question, i.e. "What does an Expression<Func<T>> have and a Func<T> not?" I just wanted to summarize the accepted answer in a very brief manner; it may sound a little oversimplified, though.
        – bertl
        Jun 17 '15 at 6:26






      • 5




        @Kyle Delaney (isAnExample) => { if(isAnExample) ok(); else expandAnswer(); } such expression is an ExpressionTree, branches are created for the If-statement.
        – Matteo Marciano - MSCP
        Jan 20 '17 at 14:47








      • 2




        @bertl Delegate is what CPU sees (executable code of one architecture), Expression is what compiler sees (merely another format of source code, but still source code).
        – codewarrior
        May 5 '17 at 9:22















      up vote
      993
      down vote



      accepted







      up vote
      993
      down vote



      accepted






      When you want to treat lambda expressions as expression trees and look inside them instead of executing them. For example, LINQ to SQL gets the expression and converts it to the equivalent SQL statement and submits it to server (rather than executing the lambda).



      Conceptually, Expression<Func<T>> is completely different from Func<T>. Func<T> denotes a delegate which is pretty much a pointer to a method and Expression<Func<T>> denotes a tree data structure for a lambda expression. This tree structure describes what a lambda expression does rather than doing the actual thing. It basically holds data about the composition of expressions, variables, method calls, ... (for example it holds information such as this lambda is some constant + some parameter). You can use this description to convert it to an actual method (with Expression.Compile) or do other stuff (like the LINQ to SQL example) with it. The act of treating lambdas as anonymous methods and expression trees is purely a compile time thing.



      Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }


      will effectively compile to an IL method that gets nothing and returns 10.



      Expression<Func<int>> myExpression = () => 10;


      will be converted to a data structure that describes an expression that gets no parameters and returns the value 10:



      Expression vs Funclarger image



      While they both look the same at compile time, what the compiler generates is totally different.






      share|improve this answer














      When you want to treat lambda expressions as expression trees and look inside them instead of executing them. For example, LINQ to SQL gets the expression and converts it to the equivalent SQL statement and submits it to server (rather than executing the lambda).



      Conceptually, Expression<Func<T>> is completely different from Func<T>. Func<T> denotes a delegate which is pretty much a pointer to a method and Expression<Func<T>> denotes a tree data structure for a lambda expression. This tree structure describes what a lambda expression does rather than doing the actual thing. It basically holds data about the composition of expressions, variables, method calls, ... (for example it holds information such as this lambda is some constant + some parameter). You can use this description to convert it to an actual method (with Expression.Compile) or do other stuff (like the LINQ to SQL example) with it. The act of treating lambdas as anonymous methods and expression trees is purely a compile time thing.



      Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }


      will effectively compile to an IL method that gets nothing and returns 10.



      Expression<Func<int>> myExpression = () => 10;


      will be converted to a data structure that describes an expression that gets no parameters and returns the value 10:



      Expression vs Funclarger image



      While they both look the same at compile time, what the compiler generates is totally different.







      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited Jan 20 '11 at 3:01

























      answered Apr 27 '09 at 13:52









      Mehrdad Afshari

      340k75774752




      340k75774752








      • 75




        So, in other words, an Expression contains the meta-information about a certain delegate.
        – bertl
        Feb 25 '15 at 13:37






      • 33




        @bertl Actually, no. The delegate is not involved at all. The reason there's any association at all with a delegate is that you can compile the expression to a delegate - or to be more precise, compile it to a method and get the delegate to that method as a return value. But the expression tree itself is just data. The delegate does not exist when you use Expression<Func<...>> instead of just Func<...>.
        – Luaan
        Jun 16 '15 at 20:15






      • 2




        You're absolutely right @Luaan. I did not mean to create any artificial relationship between Expressions and delegates. My point was related to the original question, i.e. "What does an Expression<Func<T>> have and a Func<T> not?" I just wanted to summarize the accepted answer in a very brief manner; it may sound a little oversimplified, though.
        – bertl
        Jun 17 '15 at 6:26






      • 5




        @Kyle Delaney (isAnExample) => { if(isAnExample) ok(); else expandAnswer(); } such expression is an ExpressionTree, branches are created for the If-statement.
        – Matteo Marciano - MSCP
        Jan 20 '17 at 14:47








      • 2




        @bertl Delegate is what CPU sees (executable code of one architecture), Expression is what compiler sees (merely another format of source code, but still source code).
        – codewarrior
        May 5 '17 at 9:22
















      • 75




        So, in other words, an Expression contains the meta-information about a certain delegate.
        – bertl
        Feb 25 '15 at 13:37






      • 33




        @bertl Actually, no. The delegate is not involved at all. The reason there's any association at all with a delegate is that you can compile the expression to a delegate - or to be more precise, compile it to a method and get the delegate to that method as a return value. But the expression tree itself is just data. The delegate does not exist when you use Expression<Func<...>> instead of just Func<...>.
        – Luaan
        Jun 16 '15 at 20:15






      • 2




        You're absolutely right @Luaan. I did not mean to create any artificial relationship between Expressions and delegates. My point was related to the original question, i.e. "What does an Expression<Func<T>> have and a Func<T> not?" I just wanted to summarize the accepted answer in a very brief manner; it may sound a little oversimplified, though.
        – bertl
        Jun 17 '15 at 6:26






      • 5




        @Kyle Delaney (isAnExample) => { if(isAnExample) ok(); else expandAnswer(); } such expression is an ExpressionTree, branches are created for the If-statement.
        – Matteo Marciano - MSCP
        Jan 20 '17 at 14:47








      • 2




        @bertl Delegate is what CPU sees (executable code of one architecture), Expression is what compiler sees (merely another format of source code, but still source code).
        – codewarrior
        May 5 '17 at 9:22










      75




      75




      So, in other words, an Expression contains the meta-information about a certain delegate.
      – bertl
      Feb 25 '15 at 13:37




      So, in other words, an Expression contains the meta-information about a certain delegate.
      – bertl
      Feb 25 '15 at 13:37




      33




      33




      @bertl Actually, no. The delegate is not involved at all. The reason there's any association at all with a delegate is that you can compile the expression to a delegate - or to be more precise, compile it to a method and get the delegate to that method as a return value. But the expression tree itself is just data. The delegate does not exist when you use Expression<Func<...>> instead of just Func<...>.
      – Luaan
      Jun 16 '15 at 20:15




      @bertl Actually, no. The delegate is not involved at all. The reason there's any association at all with a delegate is that you can compile the expression to a delegate - or to be more precise, compile it to a method and get the delegate to that method as a return value. But the expression tree itself is just data. The delegate does not exist when you use Expression<Func<...>> instead of just Func<...>.
      – Luaan
      Jun 16 '15 at 20:15




      2




      2




      You're absolutely right @Luaan. I did not mean to create any artificial relationship between Expressions and delegates. My point was related to the original question, i.e. "What does an Expression<Func<T>> have and a Func<T> not?" I just wanted to summarize the accepted answer in a very brief manner; it may sound a little oversimplified, though.
      – bertl
      Jun 17 '15 at 6:26




      You're absolutely right @Luaan. I did not mean to create any artificial relationship between Expressions and delegates. My point was related to the original question, i.e. "What does an Expression<Func<T>> have and a Func<T> not?" I just wanted to summarize the accepted answer in a very brief manner; it may sound a little oversimplified, though.
      – bertl
      Jun 17 '15 at 6:26




      5




      5




      @Kyle Delaney (isAnExample) => { if(isAnExample) ok(); else expandAnswer(); } such expression is an ExpressionTree, branches are created for the If-statement.
      – Matteo Marciano - MSCP
      Jan 20 '17 at 14:47






      @Kyle Delaney (isAnExample) => { if(isAnExample) ok(); else expandAnswer(); } such expression is an ExpressionTree, branches are created for the If-statement.
      – Matteo Marciano - MSCP
      Jan 20 '17 at 14:47






      2




      2




      @bertl Delegate is what CPU sees (executable code of one architecture), Expression is what compiler sees (merely another format of source code, but still source code).
      – codewarrior
      May 5 '17 at 9:22






      @bertl Delegate is what CPU sees (executable code of one architecture), Expression is what compiler sees (merely another format of source code, but still source code).
      – codewarrior
      May 5 '17 at 9:22














      up vote
      235
      down vote













      I'm adding an answer-for-noobs because these answers seemed over my head, until I realized how simple it is. Sometimes it's your expectation that it's complicated that makes you unable to 'wrap your head around it'.



      I didn't need to understand the difference until I walked into a really annoying 'bug' trying to use LINQ-to-SQL generically:



      public IEnumerable<T> Get(Func<T, bool> conditionLambda){
      using(var db = new DbContext()){
      return db.Set<T>.Where(conditionLambda);
      }
      }


      This worked great until I started getting OutofMemoryExceptions on larger datasets. Setting breakpoints inside the lambda made me realize that it was iterating through each row in my table one-by-one looking for matches to my lambda condition. This stumped me for a while, because why the heck is it treating my data table as a giant IEnumerable instead of doing LINQ-to-SQL like it's supposed to? It was also doing the exact same thing in my LINQ-to-MongoDb counterpart.



      The fix was simply to turn Func<T, bool> into Expression<Func<T, bool>>, so I googled why it needs an Expression instead of Func, ending up here.



      An expression simply turns a delegate into a data about itself. So a => a + 1 becomes something like "On the left side there's an int a. On the right side you add 1 to it." That's it. You can go home now. It's obviously more structured than that, but that's essentially all an expression tree really is--nothing to wrap your head around.



      Understanding that, it becomes clear why LINQ-to-SQL needs an Expression, and a Func isn't adequate. Func doesn't carry with it a way to get into itself, to see the nitty-gritty of how to translate it into a SQL/MongoDb/other query. You can't see whether it's doing addition or multiplication on subtraction. All you can do is run it. Expression, on the other hand, allows you to look inside the delegate and see everything it's wanting to do, empowering you to translate it into whatever you want, like a SQL query. Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table.



      Edit: expounding on my last sentence at John Peter's request:



      IQueryable extends IEnumerable, so IEnumerable's methods like Where() obtain overloads that accept Expression. When you pass an Expression to that, you keep an IQueryable as a result, but when you pass a Func, you're falling back on the base IEnumerable and you'll get an IEnumerable as a result. In other words, without noticing you've turned your dataset into a list to be iterated as opposed to something to query. It's hard to notice a difference until you really look under the hood at the signatures.






      share|improve this answer



















      • 1




        Chad; Please explain this comment a bit more: "Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table."
        – John Peters
        Oct 3 '16 at 23:03






      • 5




        This is far most best answer I read in this SO thread. Thank you sir!
        – Teoman shipahi
        Nov 7 '16 at 17:26






      • 1




        For all the noobs out there thanks a lot
        – Etienne
        Nov 22 '16 at 3:50






      • 1




        Thanks for explaining different behavior when passing Expression vs Func. It's extremely important to know!!
        – Reverove Likia
        Nov 29 '16 at 15:27






      • 3




        Great answer, thank you! This should get a lot more upvotes!
        – j00hi
        Jan 9 '17 at 9:20















      up vote
      235
      down vote













      I'm adding an answer-for-noobs because these answers seemed over my head, until I realized how simple it is. Sometimes it's your expectation that it's complicated that makes you unable to 'wrap your head around it'.



      I didn't need to understand the difference until I walked into a really annoying 'bug' trying to use LINQ-to-SQL generically:



      public IEnumerable<T> Get(Func<T, bool> conditionLambda){
      using(var db = new DbContext()){
      return db.Set<T>.Where(conditionLambda);
      }
      }


      This worked great until I started getting OutofMemoryExceptions on larger datasets. Setting breakpoints inside the lambda made me realize that it was iterating through each row in my table one-by-one looking for matches to my lambda condition. This stumped me for a while, because why the heck is it treating my data table as a giant IEnumerable instead of doing LINQ-to-SQL like it's supposed to? It was also doing the exact same thing in my LINQ-to-MongoDb counterpart.



      The fix was simply to turn Func<T, bool> into Expression<Func<T, bool>>, so I googled why it needs an Expression instead of Func, ending up here.



      An expression simply turns a delegate into a data about itself. So a => a + 1 becomes something like "On the left side there's an int a. On the right side you add 1 to it." That's it. You can go home now. It's obviously more structured than that, but that's essentially all an expression tree really is--nothing to wrap your head around.



      Understanding that, it becomes clear why LINQ-to-SQL needs an Expression, and a Func isn't adequate. Func doesn't carry with it a way to get into itself, to see the nitty-gritty of how to translate it into a SQL/MongoDb/other query. You can't see whether it's doing addition or multiplication on subtraction. All you can do is run it. Expression, on the other hand, allows you to look inside the delegate and see everything it's wanting to do, empowering you to translate it into whatever you want, like a SQL query. Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table.



      Edit: expounding on my last sentence at John Peter's request:



      IQueryable extends IEnumerable, so IEnumerable's methods like Where() obtain overloads that accept Expression. When you pass an Expression to that, you keep an IQueryable as a result, but when you pass a Func, you're falling back on the base IEnumerable and you'll get an IEnumerable as a result. In other words, without noticing you've turned your dataset into a list to be iterated as opposed to something to query. It's hard to notice a difference until you really look under the hood at the signatures.






      share|improve this answer



















      • 1




        Chad; Please explain this comment a bit more: "Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table."
        – John Peters
        Oct 3 '16 at 23:03






      • 5




        This is far most best answer I read in this SO thread. Thank you sir!
        – Teoman shipahi
        Nov 7 '16 at 17:26






      • 1




        For all the noobs out there thanks a lot
        – Etienne
        Nov 22 '16 at 3:50






      • 1




        Thanks for explaining different behavior when passing Expression vs Func. It's extremely important to know!!
        – Reverove Likia
        Nov 29 '16 at 15:27






      • 3




        Great answer, thank you! This should get a lot more upvotes!
        – j00hi
        Jan 9 '17 at 9:20













      up vote
      235
      down vote










      up vote
      235
      down vote









      I'm adding an answer-for-noobs because these answers seemed over my head, until I realized how simple it is. Sometimes it's your expectation that it's complicated that makes you unable to 'wrap your head around it'.



      I didn't need to understand the difference until I walked into a really annoying 'bug' trying to use LINQ-to-SQL generically:



      public IEnumerable<T> Get(Func<T, bool> conditionLambda){
      using(var db = new DbContext()){
      return db.Set<T>.Where(conditionLambda);
      }
      }


      This worked great until I started getting OutofMemoryExceptions on larger datasets. Setting breakpoints inside the lambda made me realize that it was iterating through each row in my table one-by-one looking for matches to my lambda condition. This stumped me for a while, because why the heck is it treating my data table as a giant IEnumerable instead of doing LINQ-to-SQL like it's supposed to? It was also doing the exact same thing in my LINQ-to-MongoDb counterpart.



      The fix was simply to turn Func<T, bool> into Expression<Func<T, bool>>, so I googled why it needs an Expression instead of Func, ending up here.



      An expression simply turns a delegate into a data about itself. So a => a + 1 becomes something like "On the left side there's an int a. On the right side you add 1 to it." That's it. You can go home now. It's obviously more structured than that, but that's essentially all an expression tree really is--nothing to wrap your head around.



      Understanding that, it becomes clear why LINQ-to-SQL needs an Expression, and a Func isn't adequate. Func doesn't carry with it a way to get into itself, to see the nitty-gritty of how to translate it into a SQL/MongoDb/other query. You can't see whether it's doing addition or multiplication on subtraction. All you can do is run it. Expression, on the other hand, allows you to look inside the delegate and see everything it's wanting to do, empowering you to translate it into whatever you want, like a SQL query. Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table.



      Edit: expounding on my last sentence at John Peter's request:



      IQueryable extends IEnumerable, so IEnumerable's methods like Where() obtain overloads that accept Expression. When you pass an Expression to that, you keep an IQueryable as a result, but when you pass a Func, you're falling back on the base IEnumerable and you'll get an IEnumerable as a result. In other words, without noticing you've turned your dataset into a list to be iterated as opposed to something to query. It's hard to notice a difference until you really look under the hood at the signatures.






      share|improve this answer














      I'm adding an answer-for-noobs because these answers seemed over my head, until I realized how simple it is. Sometimes it's your expectation that it's complicated that makes you unable to 'wrap your head around it'.



      I didn't need to understand the difference until I walked into a really annoying 'bug' trying to use LINQ-to-SQL generically:



      public IEnumerable<T> Get(Func<T, bool> conditionLambda){
      using(var db = new DbContext()){
      return db.Set<T>.Where(conditionLambda);
      }
      }


      This worked great until I started getting OutofMemoryExceptions on larger datasets. Setting breakpoints inside the lambda made me realize that it was iterating through each row in my table one-by-one looking for matches to my lambda condition. This stumped me for a while, because why the heck is it treating my data table as a giant IEnumerable instead of doing LINQ-to-SQL like it's supposed to? It was also doing the exact same thing in my LINQ-to-MongoDb counterpart.



      The fix was simply to turn Func<T, bool> into Expression<Func<T, bool>>, so I googled why it needs an Expression instead of Func, ending up here.



      An expression simply turns a delegate into a data about itself. So a => a + 1 becomes something like "On the left side there's an int a. On the right side you add 1 to it." That's it. You can go home now. It's obviously more structured than that, but that's essentially all an expression tree really is--nothing to wrap your head around.



      Understanding that, it becomes clear why LINQ-to-SQL needs an Expression, and a Func isn't adequate. Func doesn't carry with it a way to get into itself, to see the nitty-gritty of how to translate it into a SQL/MongoDb/other query. You can't see whether it's doing addition or multiplication on subtraction. All you can do is run it. Expression, on the other hand, allows you to look inside the delegate and see everything it's wanting to do, empowering you to translate it into whatever you want, like a SQL query. Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table.



      Edit: expounding on my last sentence at John Peter's request:



      IQueryable extends IEnumerable, so IEnumerable's methods like Where() obtain overloads that accept Expression. When you pass an Expression to that, you keep an IQueryable as a result, but when you pass a Func, you're falling back on the base IEnumerable and you'll get an IEnumerable as a result. In other words, without noticing you've turned your dataset into a list to be iterated as opposed to something to query. It's hard to notice a difference until you really look under the hood at the signatures.







      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited Oct 7 '16 at 16:34

























      answered Jan 5 '16 at 8:04









      Chad Hedgcock

      6,85932034




      6,85932034








      • 1




        Chad; Please explain this comment a bit more: "Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table."
        – John Peters
        Oct 3 '16 at 23:03






      • 5




        This is far most best answer I read in this SO thread. Thank you sir!
        – Teoman shipahi
        Nov 7 '16 at 17:26






      • 1




        For all the noobs out there thanks a lot
        – Etienne
        Nov 22 '16 at 3:50






      • 1




        Thanks for explaining different behavior when passing Expression vs Func. It's extremely important to know!!
        – Reverove Likia
        Nov 29 '16 at 15:27






      • 3




        Great answer, thank you! This should get a lot more upvotes!
        – j00hi
        Jan 9 '17 at 9:20














      • 1




        Chad; Please explain this comment a bit more: "Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table."
        – John Peters
        Oct 3 '16 at 23:03






      • 5




        This is far most best answer I read in this SO thread. Thank you sir!
        – Teoman shipahi
        Nov 7 '16 at 17:26






      • 1




        For all the noobs out there thanks a lot
        – Etienne
        Nov 22 '16 at 3:50






      • 1




        Thanks for explaining different behavior when passing Expression vs Func. It's extremely important to know!!
        – Reverove Likia
        Nov 29 '16 at 15:27






      • 3




        Great answer, thank you! This should get a lot more upvotes!
        – j00hi
        Jan 9 '17 at 9:20








      1




      1




      Chad; Please explain this comment a bit more: "Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table."
      – John Peters
      Oct 3 '16 at 23:03




      Chad; Please explain this comment a bit more: "Func didn't work because my DbContext was blind to what was actually in the lambda expression to turn it into SQL, so it did the next best thing and iterated that conditional through each row in my table."
      – John Peters
      Oct 3 '16 at 23:03




      5




      5




      This is far most best answer I read in this SO thread. Thank you sir!
      – Teoman shipahi
      Nov 7 '16 at 17:26




      This is far most best answer I read in this SO thread. Thank you sir!
      – Teoman shipahi
      Nov 7 '16 at 17:26




      1




      1




      For all the noobs out there thanks a lot
      – Etienne
      Nov 22 '16 at 3:50




      For all the noobs out there thanks a lot
      – Etienne
      Nov 22 '16 at 3:50




      1




      1




      Thanks for explaining different behavior when passing Expression vs Func. It's extremely important to know!!
      – Reverove Likia
      Nov 29 '16 at 15:27




      Thanks for explaining different behavior when passing Expression vs Func. It's extremely important to know!!
      – Reverove Likia
      Nov 29 '16 at 15:27




      3




      3




      Great answer, thank you! This should get a lot more upvotes!
      – j00hi
      Jan 9 '17 at 9:20




      Great answer, thank you! This should get a lot more upvotes!
      – j00hi
      Jan 9 '17 at 9:20










      up vote
      94
      down vote













      An extremely important consideration in the choice of Expression vs Func is that IQueryable providers like LINQ to Entities can 'digest' what you pass in an Expression, but will ignore what you pass in a Func. I have two blog posts on the subject:



      More on Expression vs Func with Entity Framework and
      Falling in Love with LINQ - Part 7: Expressions and Funcs (the last section)






      share|improve this answer





















      • +l for explanation. However I get 'The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.' and had to use ForEach after fetching the results.
        – tymtam
        Apr 29 '13 at 4:52















      up vote
      94
      down vote













      An extremely important consideration in the choice of Expression vs Func is that IQueryable providers like LINQ to Entities can 'digest' what you pass in an Expression, but will ignore what you pass in a Func. I have two blog posts on the subject:



      More on Expression vs Func with Entity Framework and
      Falling in Love with LINQ - Part 7: Expressions and Funcs (the last section)






      share|improve this answer





















      • +l for explanation. However I get 'The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.' and had to use ForEach after fetching the results.
        – tymtam
        Apr 29 '13 at 4:52













      up vote
      94
      down vote










      up vote
      94
      down vote









      An extremely important consideration in the choice of Expression vs Func is that IQueryable providers like LINQ to Entities can 'digest' what you pass in an Expression, but will ignore what you pass in a Func. I have two blog posts on the subject:



      More on Expression vs Func with Entity Framework and
      Falling in Love with LINQ - Part 7: Expressions and Funcs (the last section)






      share|improve this answer












      An extremely important consideration in the choice of Expression vs Func is that IQueryable providers like LINQ to Entities can 'digest' what you pass in an Expression, but will ignore what you pass in a Func. I have two blog posts on the subject:



      More on Expression vs Func with Entity Framework and
      Falling in Love with LINQ - Part 7: Expressions and Funcs (the last section)







      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered Jan 11 '12 at 15:57









      LSpencer777

      1,28811014




      1,28811014












      • +l for explanation. However I get 'The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.' and had to use ForEach after fetching the results.
        – tymtam
        Apr 29 '13 at 4:52


















      • +l for explanation. However I get 'The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.' and had to use ForEach after fetching the results.
        – tymtam
        Apr 29 '13 at 4:52
















      +l for explanation. However I get 'The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.' and had to use ForEach after fetching the results.
      – tymtam
      Apr 29 '13 at 4:52




      +l for explanation. However I get 'The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.' and had to use ForEach after fetching the results.
      – tymtam
      Apr 29 '13 at 4:52










      up vote
      61
      down vote













      I'd like to add some notes about the differences between Func<T> and Expression<Func<T>>:





      • Func<T> is just a normal old-school MulticastDelegate;


      • Expression<Func<T>> is a representation of lambda expression in form of expression tree;

      • expression tree can be constructed through lambda expression syntax or through the API syntax;

      • expression tree can be compiled to a delegate Func<T>;

      • the inverse conversion is theoretically possible, but it's a kind of decompiling, there is no builtin functionality for that as it's not a straightforward process;

      • expression tree can be observed/translated/modified through the ExpressionVisitor;

      • the extension methods for IEnumerable operate with Func<T>;

      • the extension methods for IQueryable operate with Expression<Func<T>>.


      There's an article which describes the details with code samples:
      LINQ: Func<T> vs. Expression<Func<T>>.



      Hope it will be helpful.






      share|improve this answer























      • Nice list, one small note is you mention that the inverse conversion is possible, however an exact inverse is not. Some metadata is lost during the conversion process. However you could decompile it to an Expression tree that produces the same result when compiled again.
        – Aidiakapi
        Mar 13 '15 at 19:43















      up vote
      61
      down vote













      I'd like to add some notes about the differences between Func<T> and Expression<Func<T>>:





      • Func<T> is just a normal old-school MulticastDelegate;


      • Expression<Func<T>> is a representation of lambda expression in form of expression tree;

      • expression tree can be constructed through lambda expression syntax or through the API syntax;

      • expression tree can be compiled to a delegate Func<T>;

      • the inverse conversion is theoretically possible, but it's a kind of decompiling, there is no builtin functionality for that as it's not a straightforward process;

      • expression tree can be observed/translated/modified through the ExpressionVisitor;

      • the extension methods for IEnumerable operate with Func<T>;

      • the extension methods for IQueryable operate with Expression<Func<T>>.


      There's an article which describes the details with code samples:
      LINQ: Func<T> vs. Expression<Func<T>>.



      Hope it will be helpful.






      share|improve this answer























      • Nice list, one small note is you mention that the inverse conversion is possible, however an exact inverse is not. Some metadata is lost during the conversion process. However you could decompile it to an Expression tree that produces the same result when compiled again.
        – Aidiakapi
        Mar 13 '15 at 19:43













      up vote
      61
      down vote










      up vote
      61
      down vote









      I'd like to add some notes about the differences between Func<T> and Expression<Func<T>>:





      • Func<T> is just a normal old-school MulticastDelegate;


      • Expression<Func<T>> is a representation of lambda expression in form of expression tree;

      • expression tree can be constructed through lambda expression syntax or through the API syntax;

      • expression tree can be compiled to a delegate Func<T>;

      • the inverse conversion is theoretically possible, but it's a kind of decompiling, there is no builtin functionality for that as it's not a straightforward process;

      • expression tree can be observed/translated/modified through the ExpressionVisitor;

      • the extension methods for IEnumerable operate with Func<T>;

      • the extension methods for IQueryable operate with Expression<Func<T>>.


      There's an article which describes the details with code samples:
      LINQ: Func<T> vs. Expression<Func<T>>.



      Hope it will be helpful.






      share|improve this answer














      I'd like to add some notes about the differences between Func<T> and Expression<Func<T>>:





      • Func<T> is just a normal old-school MulticastDelegate;


      • Expression<Func<T>> is a representation of lambda expression in form of expression tree;

      • expression tree can be constructed through lambda expression syntax or through the API syntax;

      • expression tree can be compiled to a delegate Func<T>;

      • the inverse conversion is theoretically possible, but it's a kind of decompiling, there is no builtin functionality for that as it's not a straightforward process;

      • expression tree can be observed/translated/modified through the ExpressionVisitor;

      • the extension methods for IEnumerable operate with Func<T>;

      • the extension methods for IQueryable operate with Expression<Func<T>>.


      There's an article which describes the details with code samples:
      LINQ: Func<T> vs. Expression<Func<T>>.



      Hope it will be helpful.







      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited Jun 11 '13 at 8:34

























      answered Jun 11 '13 at 0:02









      Olexander

      1,7521129




      1,7521129












      • Nice list, one small note is you mention that the inverse conversion is possible, however an exact inverse is not. Some metadata is lost during the conversion process. However you could decompile it to an Expression tree that produces the same result when compiled again.
        – Aidiakapi
        Mar 13 '15 at 19:43


















      • Nice list, one small note is you mention that the inverse conversion is possible, however an exact inverse is not. Some metadata is lost during the conversion process. However you could decompile it to an Expression tree that produces the same result when compiled again.
        – Aidiakapi
        Mar 13 '15 at 19:43
















      Nice list, one small note is you mention that the inverse conversion is possible, however an exact inverse is not. Some metadata is lost during the conversion process. However you could decompile it to an Expression tree that produces the same result when compiled again.
      – Aidiakapi
      Mar 13 '15 at 19:43




      Nice list, one small note is you mention that the inverse conversion is possible, however an exact inverse is not. Some metadata is lost during the conversion process. However you could decompile it to an Expression tree that produces the same result when compiled again.
      – Aidiakapi
      Mar 13 '15 at 19:43










      up vote
      53
      down vote













      There is a more philosophical explanation about it from Krzysztof Cwalina's book(Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries);




      Rico Mariani




      Edit for non-image version:




      Most times you're going to want Func or Action if all that needs to happen is to run some code. You need Expression when the code needs to be analyzed, serialized, or optimized before it is run. Expression is for thinking about code, Func/Action is for running it.







      share|improve this answer



















      • 7




        Well put. ie. You need expression when you are expecting your Func to be converted into some sort of query. Ie. you need database.data.Where(i => i.Id > 0) to be executed as SELECT FROM [data] WHERE [id] > 0. If you just pass in a Func, you've put blinders on your driver and all it can do is SELECT * and then once it's loaded all of that data into memory, iterate through each and filter out everything with id > 0. Wrapping your Func in Expression empowers the driver to analyze the Func and turn it into a Sql/MongoDb/other query.
        – Chad Hedgcock
        Mar 26 '16 at 3:59










      • the link doesn't seem to work
        – Kcats Wolfrevo
        Sep 21 '17 at 10:10










      • @KcatsWolfrevo edited for non image version.
        – Oğuzhan Soykan
        Oct 11 '17 at 18:02










      • So when i am planning for a Vacation, I would use Expression but when I am ON vacation it will be Func/Action ;)
        – GoldBishop
        Nov 7 '17 at 19:42















      up vote
      53
      down vote













      There is a more philosophical explanation about it from Krzysztof Cwalina's book(Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries);




      Rico Mariani




      Edit for non-image version:




      Most times you're going to want Func or Action if all that needs to happen is to run some code. You need Expression when the code needs to be analyzed, serialized, or optimized before it is run. Expression is for thinking about code, Func/Action is for running it.







      share|improve this answer



















      • 7




        Well put. ie. You need expression when you are expecting your Func to be converted into some sort of query. Ie. you need database.data.Where(i => i.Id > 0) to be executed as SELECT FROM [data] WHERE [id] > 0. If you just pass in a Func, you've put blinders on your driver and all it can do is SELECT * and then once it's loaded all of that data into memory, iterate through each and filter out everything with id > 0. Wrapping your Func in Expression empowers the driver to analyze the Func and turn it into a Sql/MongoDb/other query.
        – Chad Hedgcock
        Mar 26 '16 at 3:59










      • the link doesn't seem to work
        – Kcats Wolfrevo
        Sep 21 '17 at 10:10










      • @KcatsWolfrevo edited for non image version.
        – Oğuzhan Soykan
        Oct 11 '17 at 18:02










      • So when i am planning for a Vacation, I would use Expression but when I am ON vacation it will be Func/Action ;)
        – GoldBishop
        Nov 7 '17 at 19:42













      up vote
      53
      down vote










      up vote
      53
      down vote









      There is a more philosophical explanation about it from Krzysztof Cwalina's book(Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries);




      Rico Mariani




      Edit for non-image version:




      Most times you're going to want Func or Action if all that needs to happen is to run some code. You need Expression when the code needs to be analyzed, serialized, or optimized before it is run. Expression is for thinking about code, Func/Action is for running it.







      share|improve this answer














      There is a more philosophical explanation about it from Krzysztof Cwalina's book(Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries);




      Rico Mariani




      Edit for non-image version:




      Most times you're going to want Func or Action if all that needs to happen is to run some code. You need Expression when the code needs to be analyzed, serialized, or optimized before it is run. Expression is for thinking about code, Func/Action is for running it.








      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited Oct 11 '17 at 18:00

























      answered Mar 11 '16 at 13:10









      Oğuzhan Soykan

      1,2231124




      1,2231124








      • 7




        Well put. ie. You need expression when you are expecting your Func to be converted into some sort of query. Ie. you need database.data.Where(i => i.Id > 0) to be executed as SELECT FROM [data] WHERE [id] > 0. If you just pass in a Func, you've put blinders on your driver and all it can do is SELECT * and then once it's loaded all of that data into memory, iterate through each and filter out everything with id > 0. Wrapping your Func in Expression empowers the driver to analyze the Func and turn it into a Sql/MongoDb/other query.
        – Chad Hedgcock
        Mar 26 '16 at 3:59










      • the link doesn't seem to work
        – Kcats Wolfrevo
        Sep 21 '17 at 10:10










      • @KcatsWolfrevo edited for non image version.
        – Oğuzhan Soykan
        Oct 11 '17 at 18:02










      • So when i am planning for a Vacation, I would use Expression but when I am ON vacation it will be Func/Action ;)
        – GoldBishop
        Nov 7 '17 at 19:42














      • 7




        Well put. ie. You need expression when you are expecting your Func to be converted into some sort of query. Ie. you need database.data.Where(i => i.Id > 0) to be executed as SELECT FROM [data] WHERE [id] > 0. If you just pass in a Func, you've put blinders on your driver and all it can do is SELECT * and then once it's loaded all of that data into memory, iterate through each and filter out everything with id > 0. Wrapping your Func in Expression empowers the driver to analyze the Func and turn it into a Sql/MongoDb/other query.
        – Chad Hedgcock
        Mar 26 '16 at 3:59










      • the link doesn't seem to work
        – Kcats Wolfrevo
        Sep 21 '17 at 10:10










      • @KcatsWolfrevo edited for non image version.
        – Oğuzhan Soykan
        Oct 11 '17 at 18:02










      • So when i am planning for a Vacation, I would use Expression but when I am ON vacation it will be Func/Action ;)
        – GoldBishop
        Nov 7 '17 at 19:42








      7




      7




      Well put. ie. You need expression when you are expecting your Func to be converted into some sort of query. Ie. you need database.data.Where(i => i.Id > 0) to be executed as SELECT FROM [data] WHERE [id] > 0. If you just pass in a Func, you've put blinders on your driver and all it can do is SELECT * and then once it's loaded all of that data into memory, iterate through each and filter out everything with id > 0. Wrapping your Func in Expression empowers the driver to analyze the Func and turn it into a Sql/MongoDb/other query.
      – Chad Hedgcock
      Mar 26 '16 at 3:59




      Well put. ie. You need expression when you are expecting your Func to be converted into some sort of query. Ie. you need database.data.Where(i => i.Id > 0) to be executed as SELECT FROM [data] WHERE [id] > 0. If you just pass in a Func, you've put blinders on your driver and all it can do is SELECT * and then once it's loaded all of that data into memory, iterate through each and filter out everything with id > 0. Wrapping your Func in Expression empowers the driver to analyze the Func and turn it into a Sql/MongoDb/other query.
      – Chad Hedgcock
      Mar 26 '16 at 3:59












      the link doesn't seem to work
      – Kcats Wolfrevo
      Sep 21 '17 at 10:10




      the link doesn't seem to work
      – Kcats Wolfrevo
      Sep 21 '17 at 10:10












      @KcatsWolfrevo edited for non image version.
      – Oğuzhan Soykan
      Oct 11 '17 at 18:02




      @KcatsWolfrevo edited for non image version.
      – Oğuzhan Soykan
      Oct 11 '17 at 18:02












      So when i am planning for a Vacation, I would use Expression but when I am ON vacation it will be Func/Action ;)
      – GoldBishop
      Nov 7 '17 at 19:42




      So when i am planning for a Vacation, I would use Expression but when I am ON vacation it will be Func/Action ;)
      – GoldBishop
      Nov 7 '17 at 19:42










      up vote
      34
      down vote













      LINQ is the canonical example (for example, talking to a database), but in truth, any time you care more about expressing what to do, rather than actually doing it. For example, I use this approach in the RPC stack of protobuf-net (to avoid code-generation etc) - so you call a method with:



      string result = client.Invoke(svc => svc.SomeMethod(arg1, arg2, ...));


      This deconstructs the expression tree to resolve SomeMethod (and the value of each argument), performs the RPC call, updates any ref/out args, and returns the result from the remote call. This is only possible via the expression tree. I cover this more here.



      Another example is when you are building the expression trees manually for the purpose of compiling to a lambda, as done by the generic operators code.






      share|improve this answer



























        up vote
        34
        down vote













        LINQ is the canonical example (for example, talking to a database), but in truth, any time you care more about expressing what to do, rather than actually doing it. For example, I use this approach in the RPC stack of protobuf-net (to avoid code-generation etc) - so you call a method with:



        string result = client.Invoke(svc => svc.SomeMethod(arg1, arg2, ...));


        This deconstructs the expression tree to resolve SomeMethod (and the value of each argument), performs the RPC call, updates any ref/out args, and returns the result from the remote call. This is only possible via the expression tree. I cover this more here.



        Another example is when you are building the expression trees manually for the purpose of compiling to a lambda, as done by the generic operators code.






        share|improve this answer

























          up vote
          34
          down vote










          up vote
          34
          down vote









          LINQ is the canonical example (for example, talking to a database), but in truth, any time you care more about expressing what to do, rather than actually doing it. For example, I use this approach in the RPC stack of protobuf-net (to avoid code-generation etc) - so you call a method with:



          string result = client.Invoke(svc => svc.SomeMethod(arg1, arg2, ...));


          This deconstructs the expression tree to resolve SomeMethod (and the value of each argument), performs the RPC call, updates any ref/out args, and returns the result from the remote call. This is only possible via the expression tree. I cover this more here.



          Another example is when you are building the expression trees manually for the purpose of compiling to a lambda, as done by the generic operators code.






          share|improve this answer














          LINQ is the canonical example (for example, talking to a database), but in truth, any time you care more about expressing what to do, rather than actually doing it. For example, I use this approach in the RPC stack of protobuf-net (to avoid code-generation etc) - so you call a method with:



          string result = client.Invoke(svc => svc.SomeMethod(arg1, arg2, ...));


          This deconstructs the expression tree to resolve SomeMethod (and the value of each argument), performs the RPC call, updates any ref/out args, and returns the result from the remote call. This is only possible via the expression tree. I cover this more here.



          Another example is when you are building the expression trees manually for the purpose of compiling to a lambda, as done by the generic operators code.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Aug 13 at 5:57









          PeterFett

          33




          33










          answered Apr 27 '09 at 14:13









          Marc Gravell

          773k19021232538




          773k19021232538






















              up vote
              18
              down vote













              You would use an expression when you want to treat your function as data and not as code. You can do this if you want to manipulate the code (as data). Most of the time if you don't see a need for expressions then you probably don't need to use one.






              share|improve this answer

























                up vote
                18
                down vote













                You would use an expression when you want to treat your function as data and not as code. You can do this if you want to manipulate the code (as data). Most of the time if you don't see a need for expressions then you probably don't need to use one.






                share|improve this answer























                  up vote
                  18
                  down vote










                  up vote
                  18
                  down vote









                  You would use an expression when you want to treat your function as data and not as code. You can do this if you want to manipulate the code (as data). Most of the time if you don't see a need for expressions then you probably don't need to use one.






                  share|improve this answer












                  You would use an expression when you want to treat your function as data and not as code. You can do this if you want to manipulate the code (as data). Most of the time if you don't see a need for expressions then you probably don't need to use one.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Apr 27 '09 at 13:53









                  Andrew Hare

                  273k53573598




                  273k53573598






















                      up vote
                      15
                      down vote













                      The primary reason is when you don't want to run the code directly, but rather, want to inspect it. This can be for any number of reasons:




                      • Mapping the code to a different environment (ie. C# code to SQL in Entity Framework)

                      • Replacing parts of the code in runtime (dynamic programming or even plain DRY techniques)

                      • Code validation (very useful when emulating scripting or when doing analysis)

                      • Serialization - expressions can be serialized rather easily and safely, delegates can't

                      • Strongly-typed safety on things that aren't inherently strongly-typed, and exploiting compiler checks even though you're doing dynamic calls in runtime (ASP.NET MVC 5 with Razor is a nice example)






                      share|improve this answer





















                      • can you elaborate a bit more on no.5
                        – uowzd01
                        Oct 25 '15 at 23:09










                      • @uowzd01 Just look at Razor - it uses this approach extensively.
                        – Luaan
                        Oct 26 '15 at 8:04










                      • @Luaan I am looking for expression serializations but not able to find anything without a limited third party usage. Does .Net 4.5 support expression tree serialization?
                        – vabii
                        Dec 12 '17 at 19:27










                      • @vabii Not that I know of - and it wouldn't really be a good idea for the general case. My point was more about you being able to write pretty simple serialization for the specific cases you want to support, against interfaces designed ahead of time - I've done just that a few times. In the general case, an Expression can be just as impossible to serialize as a delegate, since any expression can contain an invocation of an arbitrary delegate/method reference. "Easy" is relative, of course.
                        – Luaan
                        Dec 13 '17 at 14:30










                      • @Luaan Thanks for clarifying.
                        – vabii
                        Dec 13 '17 at 16:07















                      up vote
                      15
                      down vote













                      The primary reason is when you don't want to run the code directly, but rather, want to inspect it. This can be for any number of reasons:




                      • Mapping the code to a different environment (ie. C# code to SQL in Entity Framework)

                      • Replacing parts of the code in runtime (dynamic programming or even plain DRY techniques)

                      • Code validation (very useful when emulating scripting or when doing analysis)

                      • Serialization - expressions can be serialized rather easily and safely, delegates can't

                      • Strongly-typed safety on things that aren't inherently strongly-typed, and exploiting compiler checks even though you're doing dynamic calls in runtime (ASP.NET MVC 5 with Razor is a nice example)






                      share|improve this answer





















                      • can you elaborate a bit more on no.5
                        – uowzd01
                        Oct 25 '15 at 23:09










                      • @uowzd01 Just look at Razor - it uses this approach extensively.
                        – Luaan
                        Oct 26 '15 at 8:04










                      • @Luaan I am looking for expression serializations but not able to find anything without a limited third party usage. Does .Net 4.5 support expression tree serialization?
                        – vabii
                        Dec 12 '17 at 19:27










                      • @vabii Not that I know of - and it wouldn't really be a good idea for the general case. My point was more about you being able to write pretty simple serialization for the specific cases you want to support, against interfaces designed ahead of time - I've done just that a few times. In the general case, an Expression can be just as impossible to serialize as a delegate, since any expression can contain an invocation of an arbitrary delegate/method reference. "Easy" is relative, of course.
                        – Luaan
                        Dec 13 '17 at 14:30










                      • @Luaan Thanks for clarifying.
                        – vabii
                        Dec 13 '17 at 16:07













                      up vote
                      15
                      down vote










                      up vote
                      15
                      down vote









                      The primary reason is when you don't want to run the code directly, but rather, want to inspect it. This can be for any number of reasons:




                      • Mapping the code to a different environment (ie. C# code to SQL in Entity Framework)

                      • Replacing parts of the code in runtime (dynamic programming or even plain DRY techniques)

                      • Code validation (very useful when emulating scripting or when doing analysis)

                      • Serialization - expressions can be serialized rather easily and safely, delegates can't

                      • Strongly-typed safety on things that aren't inherently strongly-typed, and exploiting compiler checks even though you're doing dynamic calls in runtime (ASP.NET MVC 5 with Razor is a nice example)






                      share|improve this answer












                      The primary reason is when you don't want to run the code directly, but rather, want to inspect it. This can be for any number of reasons:




                      • Mapping the code to a different environment (ie. C# code to SQL in Entity Framework)

                      • Replacing parts of the code in runtime (dynamic programming or even plain DRY techniques)

                      • Code validation (very useful when emulating scripting or when doing analysis)

                      • Serialization - expressions can be serialized rather easily and safely, delegates can't

                      • Strongly-typed safety on things that aren't inherently strongly-typed, and exploiting compiler checks even though you're doing dynamic calls in runtime (ASP.NET MVC 5 with Razor is a nice example)







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Mar 26 '14 at 12:54









                      Luaan

                      48k45783




                      48k45783












                      • can you elaborate a bit more on no.5
                        – uowzd01
                        Oct 25 '15 at 23:09










                      • @uowzd01 Just look at Razor - it uses this approach extensively.
                        – Luaan
                        Oct 26 '15 at 8:04










                      • @Luaan I am looking for expression serializations but not able to find anything without a limited third party usage. Does .Net 4.5 support expression tree serialization?
                        – vabii
                        Dec 12 '17 at 19:27










                      • @vabii Not that I know of - and it wouldn't really be a good idea for the general case. My point was more about you being able to write pretty simple serialization for the specific cases you want to support, against interfaces designed ahead of time - I've done just that a few times. In the general case, an Expression can be just as impossible to serialize as a delegate, since any expression can contain an invocation of an arbitrary delegate/method reference. "Easy" is relative, of course.
                        – Luaan
                        Dec 13 '17 at 14:30










                      • @Luaan Thanks for clarifying.
                        – vabii
                        Dec 13 '17 at 16:07


















                      • can you elaborate a bit more on no.5
                        – uowzd01
                        Oct 25 '15 at 23:09










                      • @uowzd01 Just look at Razor - it uses this approach extensively.
                        – Luaan
                        Oct 26 '15 at 8:04










                      • @Luaan I am looking for expression serializations but not able to find anything without a limited third party usage. Does .Net 4.5 support expression tree serialization?
                        – vabii
                        Dec 12 '17 at 19:27










                      • @vabii Not that I know of - and it wouldn't really be a good idea for the general case. My point was more about you being able to write pretty simple serialization for the specific cases you want to support, against interfaces designed ahead of time - I've done just that a few times. In the general case, an Expression can be just as impossible to serialize as a delegate, since any expression can contain an invocation of an arbitrary delegate/method reference. "Easy" is relative, of course.
                        – Luaan
                        Dec 13 '17 at 14:30










                      • @Luaan Thanks for clarifying.
                        – vabii
                        Dec 13 '17 at 16:07
















                      can you elaborate a bit more on no.5
                      – uowzd01
                      Oct 25 '15 at 23:09




                      can you elaborate a bit more on no.5
                      – uowzd01
                      Oct 25 '15 at 23:09












                      @uowzd01 Just look at Razor - it uses this approach extensively.
                      – Luaan
                      Oct 26 '15 at 8:04




                      @uowzd01 Just look at Razor - it uses this approach extensively.
                      – Luaan
                      Oct 26 '15 at 8:04












                      @Luaan I am looking for expression serializations but not able to find anything without a limited third party usage. Does .Net 4.5 support expression tree serialization?
                      – vabii
                      Dec 12 '17 at 19:27




                      @Luaan I am looking for expression serializations but not able to find anything without a limited third party usage. Does .Net 4.5 support expression tree serialization?
                      – vabii
                      Dec 12 '17 at 19:27












                      @vabii Not that I know of - and it wouldn't really be a good idea for the general case. My point was more about you being able to write pretty simple serialization for the specific cases you want to support, against interfaces designed ahead of time - I've done just that a few times. In the general case, an Expression can be just as impossible to serialize as a delegate, since any expression can contain an invocation of an arbitrary delegate/method reference. "Easy" is relative, of course.
                      – Luaan
                      Dec 13 '17 at 14:30




                      @vabii Not that I know of - and it wouldn't really be a good idea for the general case. My point was more about you being able to write pretty simple serialization for the specific cases you want to support, against interfaces designed ahead of time - I've done just that a few times. In the general case, an Expression can be just as impossible to serialize as a delegate, since any expression can contain an invocation of an arbitrary delegate/method reference. "Easy" is relative, of course.
                      – Luaan
                      Dec 13 '17 at 14:30












                      @Luaan Thanks for clarifying.
                      – vabii
                      Dec 13 '17 at 16:07




                      @Luaan Thanks for clarifying.
                      – vabii
                      Dec 13 '17 at 16:07










                      up vote
                      7
                      down vote













                      I don't see any answers yet that mention performance. Passing Func<>s into Where() or Count() is bad. Real bad. If you use a Func<> then it calls the IEnumerable LINQ stuff instead of IQueryable, which means that whole tables get pulled in and then filtered. Expression<Func<>> is significantly faster, especially if you are querying a database that lives another server.






                      share|improve this answer





















                      • Does this apply to in-memory query as well?
                        – stt106
                        Jan 4 at 15:18










                      • @stt106 Probably not.
                        – mhenry1384
                        Jan 6 at 2:54










                      • This is only true if you enumerate the list. If you use GetEnumerator or foreach you will not load the ienumerable fully into memory.
                        – nelsontruran
                        Apr 23 at 20:17






                      • 1




                        @stt106 When passed to the .Where() clause of a List<>, Expression<Func<>> gets .Compile() called on it, so Func<> is almost certainly faster. See referencesource.microsoft.com/#System.Core/System/Linq/…
                        – NStuke
                        Aug 1 at 18:43















                      up vote
                      7
                      down vote













                      I don't see any answers yet that mention performance. Passing Func<>s into Where() or Count() is bad. Real bad. If you use a Func<> then it calls the IEnumerable LINQ stuff instead of IQueryable, which means that whole tables get pulled in and then filtered. Expression<Func<>> is significantly faster, especially if you are querying a database that lives another server.






                      share|improve this answer





















                      • Does this apply to in-memory query as well?
                        – stt106
                        Jan 4 at 15:18










                      • @stt106 Probably not.
                        – mhenry1384
                        Jan 6 at 2:54










                      • This is only true if you enumerate the list. If you use GetEnumerator or foreach you will not load the ienumerable fully into memory.
                        – nelsontruran
                        Apr 23 at 20:17






                      • 1




                        @stt106 When passed to the .Where() clause of a List<>, Expression<Func<>> gets .Compile() called on it, so Func<> is almost certainly faster. See referencesource.microsoft.com/#System.Core/System/Linq/…
                        – NStuke
                        Aug 1 at 18:43













                      up vote
                      7
                      down vote










                      up vote
                      7
                      down vote









                      I don't see any answers yet that mention performance. Passing Func<>s into Where() or Count() is bad. Real bad. If you use a Func<> then it calls the IEnumerable LINQ stuff instead of IQueryable, which means that whole tables get pulled in and then filtered. Expression<Func<>> is significantly faster, especially if you are querying a database that lives another server.






                      share|improve this answer












                      I don't see any answers yet that mention performance. Passing Func<>s into Where() or Count() is bad. Real bad. If you use a Func<> then it calls the IEnumerable LINQ stuff instead of IQueryable, which means that whole tables get pulled in and then filtered. Expression<Func<>> is significantly faster, especially if you are querying a database that lives another server.







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Jun 16 '17 at 15:58









                      mhenry1384

                      5,55544161




                      5,55544161












                      • Does this apply to in-memory query as well?
                        – stt106
                        Jan 4 at 15:18










                      • @stt106 Probably not.
                        – mhenry1384
                        Jan 6 at 2:54










                      • This is only true if you enumerate the list. If you use GetEnumerator or foreach you will not load the ienumerable fully into memory.
                        – nelsontruran
                        Apr 23 at 20:17






                      • 1




                        @stt106 When passed to the .Where() clause of a List<>, Expression<Func<>> gets .Compile() called on it, so Func<> is almost certainly faster. See referencesource.microsoft.com/#System.Core/System/Linq/…
                        – NStuke
                        Aug 1 at 18:43


















                      • Does this apply to in-memory query as well?
                        – stt106
                        Jan 4 at 15:18










                      • @stt106 Probably not.
                        – mhenry1384
                        Jan 6 at 2:54










                      • This is only true if you enumerate the list. If you use GetEnumerator or foreach you will not load the ienumerable fully into memory.
                        – nelsontruran
                        Apr 23 at 20:17






                      • 1




                        @stt106 When passed to the .Where() clause of a List<>, Expression<Func<>> gets .Compile() called on it, so Func<> is almost certainly faster. See referencesource.microsoft.com/#System.Core/System/Linq/…
                        – NStuke
                        Aug 1 at 18:43
















                      Does this apply to in-memory query as well?
                      – stt106
                      Jan 4 at 15:18




                      Does this apply to in-memory query as well?
                      – stt106
                      Jan 4 at 15:18












                      @stt106 Probably not.
                      – mhenry1384
                      Jan 6 at 2:54




                      @stt106 Probably not.
                      – mhenry1384
                      Jan 6 at 2:54












                      This is only true if you enumerate the list. If you use GetEnumerator or foreach you will not load the ienumerable fully into memory.
                      – nelsontruran
                      Apr 23 at 20:17




                      This is only true if you enumerate the list. If you use GetEnumerator or foreach you will not load the ienumerable fully into memory.
                      – nelsontruran
                      Apr 23 at 20:17




                      1




                      1




                      @stt106 When passed to the .Where() clause of a List<>, Expression<Func<>> gets .Compile() called on it, so Func<> is almost certainly faster. See referencesource.microsoft.com/#System.Core/System/Linq/…
                      – NStuke
                      Aug 1 at 18:43




                      @stt106 When passed to the .Where() clause of a List<>, Expression<Func<>> gets .Compile() called on it, so Func<> is almost certainly faster. See referencesource.microsoft.com/#System.Core/System/Linq/…
                      – NStuke
                      Aug 1 at 18:43


















                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f793571%2fwhy-would-you-use-expressionfunct-rather-than-funct%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      這個網誌中的熱門文章

                      Xamarin.form Move up view when keyboard appear

                      Post-Redirect-Get with Spring WebFlux and Thymeleaf

                      Anylogic : not able to use stopDelay()