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:
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:
<%@ 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).