EntityFramework, usare un parametro in un controllo di tipo stringa convertito in Guid
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:
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:
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.
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:C#
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);
}
}
}
}
}
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: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>
...
Se ControlID è blank o uguale a this viene recuperata la PropertyName del controllo contenitore che può essere di tipo Guid.