Quando si vuole filtrare un EntityDataSource (Entity Framework 4) con un parametro di tipo Guid recuperato da querystring, il normale QueryStringParameter non serve in quanto genera un exception di questo tipo:
The argument types 'Edm.Guid' and 'Edm.String' are incompatible for this operation. Near WHERE predicate, line nnn, column ccc.
questo perche non gestisce i tipi di tipo Guid.
Per risolvere il problema si può creare un custom parameter come quello sotto riportato:

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Sgart.Parameters
{
  /// <summary>
  /// convert a querystring of type string in guid
  /// Use:
  /// <%@ Register Assembly="Sgart" Namespace="Sgart.Parameters" TagPrefix="sgart" %>
  /// <sgart:QueryStringToGuidParameter Name="idp" QueryStringField="ID" Type="Object" />
  /// </summary>
  public class QueryStringToGuidParameter : System.Web.UI.WebControls.Parameter
  {
    protected override object Evaluate(HttpContext context, System.Web.UI.Control control)
    {
      Guid id = Guid.Empty;
      if (string.IsNullOrEmpty(this.QueryStringField) == false)
      {
        Guid.TryParse(context.Request.QueryString[this.QueryStringField], out id);
      }
      return id;
    }

    public string QueryStringField
    {
      get
      {
        object obj = base.ViewState["SgartQueryStringField"];
        if (obj == null)
          return string.Empty;
        return (string)obj;
      }
      set
      {
        if (this.QueryStringField != value)
        {
          base.ViewState["SgartQueryStringField"] = value;
          base.OnParameterChanged();
        }
      }
    }
  }
}
In pratica estendo la classe Parameter, faccio l'override del metodo Evaluate dove recupero il parametro stringa (QueryStringField) dalla QueryString e lo converto in un Guid.

Per usarlo in un aspx / ascx fai riferimento all'esempio qua sotto:

XML

<%@ Control Language="C#" AutoEventWireup="true"  %>
<%@ Register Assembly="Sgart" Namespace="Sgart.Parameters" TagPrefix="sgart" %>

  <asp:EntityDataSource ID="EntityDataSource1" runat="server" ConnectionString="..."
    DefaultContainerName="..." EnableFlattening="False" ContextTypeName="..."
    EntitySetName="ProjectSet" 
    Where="it.IDProject = @idp" >
    <WhereParameters>
      <sgart:QueryStringToGuidParameter Name="idp" QueryStringField="ID" Type="Object" />
    </WhereParameters>
  </asp:EntityDataSource>
...
da notare che il tipo di parametro (Type) va impostato a Object, Name è il nome del parametro come indicato nella property Where (idp) mentre QueryStringField è il nome del parametro da recuperare dalla QueryString (ID).
Tags:
C#236 Esempi225
Potrebbe interessarti anche: