Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I actually came across your post because I was looking for the exact same information. I am writing a simple MySql query provider to be used with RIA services. Since there was no answer I thought I would add my findings even though the question is somewhat old. When you write your server side query method it might be "IQueryable GetCustomers()", but on the client side you will have a GetCustomersQuery(). The way you actually get the data isn't by calling the GetCustomers method, but by calling the Load method and passing it the query.</p> <p>The point is that RIA will then use your GetCustomers method to get an IQueryable, take the expression tree from your client side composed query and compose them together, and only then does it enumerate the IQueryable and return the result. That is why the query provider can see the expression tree that you created on the client side. There is a way to look at the SQL query string generated by entity framework, but I am not sure offhand how (try looking up the ToTraceString method).</p> <p>About being able to look at the expression tree, you could create a stub implementation of the IQueryable and IQueryProvider interfaces, and use it to look at the expression tree (for debugging). Here is a code sample for implementing these interfaces (with the vital organs removed from IQueryProvider, borrowed heavily from <a href="http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx" rel="nofollow">The Wayward Weblog - Building an IQueryable Provider</a>):</p> <pre><code>public class Query&lt;T&gt; : IQueryable&lt;T&gt;, IQueryable, IEnumerable&lt;T&gt;, IEnumerable, IOrderedQueryable&lt;T&gt;, IOrderedQueryable { IQueryProvider provider; Expression expression; public Query(IQueryProvider provider) { if (provider == null) { throw new ArgumentNullException("provider"); } this.provider = provider; this.expression = Expression.Constant(this); } public Query(IQueryProvider provider, Expression expression) { if (provider == null) { throw new ArgumentNullException("provider"); } if (expression == null) { throw new ArgumentNullException("expression"); } if (!typeof(IQueryable&lt;T&gt;).IsAssignableFrom(expression.Type)) { throw new ArgumentOutOfRangeException("expression"); } this.provider = provider; this.expression = expression; } Expression IQueryable.Expression { get { return this.expression; } } Type IQueryable.ElementType { get { return typeof(T); } } IQueryProvider IQueryable.Provider { get { return this.provider; } } public IEnumerator&lt;T&gt; GetEnumerator() { return ((IEnumerable&lt;T&gt;)this.provider.Execute(this.expression)).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)this.provider.Execute(this.expression)).GetEnumerator(); } } public class QueryProvider : IQueryProvider { #region IQueryProvider Implementation public IQueryable&lt;T&gt; CreateQuery&lt;T&gt;(Expression expression) { return new Query&lt;T&gt;(this, expression); } public IQueryable CreateQuery(Expression expression) { Type elementType = TypeSystem.GetElementType(expression.Type); try { return (IQueryable)Activator.CreateInstance(typeof(Query&lt;&gt;).MakeGenericType(elementType), new object[] { this, expression }); } catch (TargetInvocationException e) { throw e.InnerException; } } public S Execute&lt;S&gt;(Expression expression) { return (S)this.Execute(expression); } public object Execute(Expression expression) { // You can write code here to look at the expression tree :P return null; } #endregion } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload