title: How do I correctly filter my DataSet by GUID using OData?
body: <p><strong>How do I correctly filter my <code>DataSet</code> by GUID?</strong></p>
  
  <p>I'm exposing an OData endpoint, and trying to navigate to the URL:</p>
  
  <blockquote>
    <p><code>http://localhost:5001/mystuf/api/v2/AccountSet?$filter=AccountId%20eq%20guid%2703a0a47b-e3a2-e311-9402-00155d104c22%27</code></p>
  </blockquote>
  
  <p>When my OData endpoint tries to filter the <code>DataSet</code> on that GUID, I am getting:</p>
  
  <pre><code>"message": "Invalid 'where' condition. An entity member is invoking
  an invalid property or method.", "type": "System.NotSupportedException"
  &gt; 
  {
    "odata.error": {
      "code": "",
      "message": {
        "lang": "en-US",
        "value": "An error has occurred."
      },
      "innererror": {
        "message": "Invalid 'where' condition. An entity member is invoking an invalid property or method.",
        "type": "System.NotSupportedException",
        "stacktrace": "   at Microsoft.Xrm.Sdk.Linq.QueryProvider.ThrowException(Exception exception)
     at Microsoft.Xrm.Sdk.Linq.QueryProvider.FindValidEntityExpression(Expression exp, String operation)
     at Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereCondition(BinaryExpression be, FilterExpressionWrapper parentFilter, Func`2 getFilter, Boolean negate)
     at Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhere(String parameterName, BinaryExpression be, FilterExpressionWrapper parentFilter, Func`2 getFilter, List`1 linkLookups, Boolean negate)
     at Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereBoolean(String parameterName, Expression exp, FilterExpressionWrapper parentFilter, Func`2 getFilter, List`1 linkLookups, BinaryExpression parent, Boolean negate)
     at Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhere(QueryExpression qe, String parameterName, Expression exp, List`1 linkLookups)
     at Microsoft.Xrm.Sdk.Linq.QueryProvider.GetQueryExpression(Expression expression, Boolean&amp; throwIfSequenceIsEmpty, Boolean&amp; throwIfSequenceNotSingle, Projection&amp; projection, NavigationSource&amp; source, List`1&amp; linkLookups)
     at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](Expression expression)
     at Microsoft.Xrm.Sdk.Linq.QueryProvider.GetEnumerator[TElement](Expression expression)
     at Microsoft.Xrm.Sdk.Linq.Query`1.GetEnumerator()
     at Microsoft.Xrm.Sdk.Linq.Query`1.System.Collections.IEnumerable.GetEnumerator()
     at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
     at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
     at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
     at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
     at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
     at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)
     at System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)
     at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content)
     at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)
     --- End of stack trace from previous location where exception was thrown ---
     at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
     at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
     at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
     at System.Web.Http.Tracing.ITraceWriterExtensions.&lt;TraceBeginEndAsyncCore&gt;d__24.MoveNext()
     --- End of stack trace from previous location where exception was thrown ---
     at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
     at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
     at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
     at System.Web.Http.Owin.HttpMessageHandlerAdapter.&lt;BufferResponseContentAsync&gt;d__13.MoveNext()"
      }
    }
  }
  </code></pre>
  
  <p>The start of the CSDL file looks something like this:</p>
  
  <pre class="lang-xml prettyprint-override"><code>&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?&gt;
      &lt;Schema Namespace="Xrm" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2007/05/edm"&gt;
  
        &lt;EntityType Name="Account"&gt;
          &lt;Key&gt;
            &lt;PropertyRef Name="AccountId" /&gt;
          &lt;/Key&gt;
          &lt;Property Name="TerritoryCode" Type="Microsoft.Crm.Sdk.Data.Services.OptionSetValue" Nullable="false" /&gt;
          &lt;Property Name="LastUsedInCampaign" Type="Edm.DateTime" Nullable="true" /&gt;
  …
  </code></pre>
  
  <p>The controller that is getting triggered is:</p>
  
  <pre class="lang-cs prettyprint-override"><code>public IHttpActionResult Get(ODataQueryOptions&lt;Account&gt; options)
  {
      var retval = options.ApplyTo(_accountService.GetAccountSet());
  
      return Ok(retval);
  
  }
  </code></pre>
  
  <p>And the above <code>Get()</code> method applies the filter to:</p>
  
  <pre class="lang-cs prettyprint-override"><code>public IQueryable&lt;Account&gt; GetAccountSet()
  {
      return _xrmServiceContext.AccountSet;
  }
  </code></pre>
  
  <p><strong>How do I correctly filter my <code>DataSet</code> by GUID?</strong></p>
  
  <p>Please note that when I return this instead:</p>
  
  <pre class="lang-cs prettyprint-override"><code>return _xrmServiceContext.AccountSet.Take(2);
  </code></pre>
  
  <p>Then data is returned correctly to the client (serialization/deserialization correctly works); however, the filter is not applied at all. </p>