Quando si vuole filtrare un EntityDataSource (Entity Framework 4) con un parametro di tipo Guid recuperato da una proprietà di un altro controllo , il normale ControlParameter non serve in quanto genera un exception di questo tipo:
The argument types 'Edm.Guid' and 'Edm.String' are incompatible for this operation. Near equals expression, line nnn, column ccc.
Per risolvere il problema è necessario implementare un custom ControlParameter come quello qui sotto che legge una proprietà di un controllo di tipo Guid o string che contiene una rappresentazione stringa di un Guid:
using System;
using System.Web;

namespace Sgart.Parameters
{
  /// <summary>
  /// custo control paramter for type Guid
  /// Use: 
  /// <%@ Register Assembly="Sgart" Namespace="Sgart.Parameters" TagPrefix="sgart" %>
  /// <sgart:ControlToGuidParameter  Name="paymentType"  ControlID="this" PropertyName="PropertyNameXXX" Type="Object" />
  /// </summary>
  public class ControlToGuidParameter : System.Web.UI.WebControls.ControlParameter
  {
    protected override object Evaluate(HttpContext context, System.Web.UI.Control control)
    {
      if (string.IsNullOrEmpty(ControlID) || ControlID.Equals("this", StringComparison.InvariantCultureIgnoreCase))
      {
        ControlID = control.NamingContainer.ID;
      }
      object obj2 =  base.Evaluate(context, control);
      if (obj2 == null)
      {
        return null;
      }
      else
      {
        if (obj2 is System.Guid)
        {
          //property is a guid, simply return it
          return (Guid)obj2;
        }
        else
        {
          //convert string to guid
          return new Guid((string)obj2);
        }
      }
    }
  }
}
In pratica estendo la classe ControlParameter, faccio l'override del metodo Evaluate dove ritorno il valore stringa del guid convertito in un oggetto Guid.
Per usarlo in un aspx / ascx fai riferimento all'esempio qua sotto:
<%@ Control Language="C#" AutoEventWireup="true"  %>
<%@ Register Assembly="Sgart" Namespace="Sgart.Parameters" TagPrefix="sgart" %>

  <asp:HiddenField ID="ctrIDProject" runat="server" value="{2D8719D1-277C-4F69-BA4B-EF3FECB05785}" />

  <asp:EntityDataSource ID="EntityDataSource1" runat="server" ConnectionString="..."
    DefaultContainerName="..." EnableFlattening="False" ContextTypeName="..."
    EntitySetName="ProjectSet" 
    Where="it.IDProject = @idp" >
    <WhereParameters>
      <sgart:ControlToGuidParameter Name="idp" ControlID="ctrIDProject" PropertyName="Value" 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 ControlID è l'ID del controllo da cui recuperare il valore dalla proprietà PropertyName.
Se ControlID è blank o uguale a this viene recuperata la PropertyName del controllo contenitore che può essere di tipo Guid.