Si vous aviez manipulé des SqlDataSource en ASP.NET à l'époque pré-LINQ, vous aviez peut-être rencontré un problème lors de la conversion d'objet de type System.Guid (représentant un "uniqueidentifier" sous SQL Server) et le type System.Object. Une astuce simple consistait alors à changer le type du ControlParameter de Guid à Object de la manière suivante :
Avant changement :
<asp:ControlParameter ControlID="gv_Categories" Name="CategoryId" PropertyName="SelectedValue" Type="Guid" />
Après changement :
<asp:ControlParameter ControlID="gv_Categories" Name="CategoryId" PropertyName="SelectedValue" Type="Object" />
Pour rappel un ControlParameter est un paramètre que l'on passe à notre SqlDataSource / LinqDataSource, mais dont la valeur provient d'un autre contrôle de la page (dans le cas d'affichage maître / valeur, Client et Achat relatifs au client séléctionné, par exemple).
Cette astuce ne fonctionne plus avec l'apparition des LinqDataSource. Pourquoi ? L'explication est simple, comme la LinqDataSource s'appuie sur la définition de votre DataContext typé, le typage est bel et bien défini et il faut alors passer par une conversion "régulière".
Ainsi, nous allons pouvoir utiliser certaines opérations de conversion dans la partie déclarative de notre LinqDataSource (dans la propriété Where précisément). La conversion est supportée pour les types de bases suivants : Int16, UInt16, Int32, UInt32, Int64, UInt64, Object, Boolean, String, Double, Guid, TimeSpan, Decimal, Single, Sbyte et Byte.
Pour effectuer la conversion, il suffit juste d'écrire votre clause Where de la manière suivante :
Where="MonParametre == Guid?(@MonParametre)"
Remarquez au passage que l'on peut tout à fait convertir en type nullable.
Ce qui donne pour la déclaration complète de notre LinqDataSource :
<asp:LinqDataSource ID="LinqDataSource_MenuActions" runat="server"
ContextTypeName="MonDataContext" EnableDelete="True"
EnableInsert="True" EnableUpdate="True" OrderBy="BackOfficeActionPosition"
TableName="BackOfficeActions" Where="BackOfficeMenuID == Guid?(@BackOfficeMenuID)">
<WhereParameters>
<asp:ControlParameter ControlID="GridView_Menus"
Name="BackOfficeMenuID" PropertyName="SelectedValue" DbType="Guid"/>
</WhereParameters>
</asp:LinqDataSource>
Voilà pour la petite astuce.
A bientôt