EntityFramework, usare un parametro in QueryString di tipo Guid
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:
Per risolvere il problema si può creare un custom parameter come quello sotto riportato:
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:
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).
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();
}
}
}
}
}
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>
...