Je veux réaliser une jointure dans le code.
J'ai conservé la base ASPNETDB pour la gestion de tous les utilisateurs de la communauté, leurs authentification par MemberShipUser SQL provider.
Pour les besoins de mon application, j'ai une Base de Données avec une table qui gérent les infos spécifiques de mes Membres ce que l'on ne trouve pas dans ASPNETDB.
La jointure entre les deux tables se fait par le MembreGUID d'un côté et par le UserId dans ASPNETDB.
LINQ doit pouvoir me faire la jointure, dans le code, sans que je modifie mes tables, mes bases, mes procédures stockées car je sais que déployer de telles modifications ce n'est pas une sinécure.
Voici comment j'effectue ma jointure :
private void BuildDataSource()
{
///
/// Acces aux donnes
///
// On peut recuperer les MemberUser mais on ne sait pas quoi en faire
MembershipUserCollection muc = Membership.GetAllUsers();
// Preparation de l'appel a la procedure stockee aspnet_Membership_GetAllUsers
SqlParameter[] parameters = new SqlParameter[ 3 ];
parameters[ 0 ] = new SqlParameter( "@ApplicationName", SqlDbType.VarChar );
parameters[ 0 ].Value = "/"; // Application.ToString();
parameters[ 1 ] = new SqlParameter( "@PageIndex", SqlDbType.Int );
parameters[ 1 ].Value = 0;
parameters[ 2 ] = new SqlParameter( "@PageSize", SqlDbType.Int );
parameters[ 2 ].Value = 5000;
// Infos du User
DataSet dsUser = new DataSet();
dsUser = SqlDataProvider.ExecuteDataset
(
System.Configuration.ConfigurationManager.ConnectionStrings[ "LocalSqlServer" ].ConnectionString,
CommandType.StoredProcedure,
"aspnet_Membership_GetAllUsers",
parameters
);
// Infos du membre
DataSet dsMember = new DataSet();
dsMember = SqlDataProvider.ExecuteDataset
(
Tools.DatabaseConnectionString,
CommandType.StoredProcedure,
"GetMemberInfoAll"
);
///
/// La Jointure
///
DataTable dtMember = dsMember.Tables[ 0 ];
DataTable dtUser = dsUser.Tables[ 0 ];
IEnumerable<DataRow> memberQuery =
from member in dtMember.AsEnumerable()
select member;
IEnumerable<DataRow> userQuery =
from user in dtUser.AsEnumerable()
select user;
var userMemberQuery =
from m in memberQuery.AsEnumerable()
join u in userQuery.AsEnumerable()
on m.Field<Guid>( "MembreGUID" ) equals u.Field<Guid>( "UserId" )
orderby m.Field<Guid>( "MembreGUID" ) descending
select new
{
MembreGuid = m[ "MembreGUID" ],
NomUtilisateur = m[ "NomUtilisateur" ],
MotDePasse = m[ "MotDePasse" ],
Nom = m[ "Nom" ],
Prenom = m[ "Prenom" ],
Societe = m[ "Societe" ],
Telephone = m[ "Telephone" ],
Adresse = m["Adresse" ],
IsApproved = u["IsApproved" ],
};
//
// Construction de la table de resultats
//
DataTable userMember = new DataTable();
DataColumn[] colums = new DataColumn[ dtUser.Columns.Count + dtMember.Columns.Count ];
dtUser.Columns.CopyTo( colums, 0 );
dtMember.Columns.CopyTo( colums, dtUser.Columns.Count);
foreach ( DataColumn dc in colums )
{
DataColumn dc1 = new DataColumn();
dc1.ColumnName = dc.ColumnName;
userMember.Columns.Add( dc1 );
}
foreach ( var row in userMemberQuery )
{
DataRow r = userMember.NewRow();
r[ "MembreGUID" ] = row.MembreGuid;
r[ "NomUtilisateur" ] = row.NomUtilisateur;
r[ "MotDePasse" ] = row.MotDePasse;
r[ "Nom" ] = row.Nom;
r[ "Prenom" ] = row.Prenom;
r[ "Societe" ] = row.Societe;
r[ "Telephone" ] = row.Telephone;
r[ "Adresse" ] = row.Adresse;
r[ "IsApproved" ] = row.IsApproved;
userMember.Rows.Add( r );
}
GridViewMembers.DataSource = userMember; // userMemberQuery; // userMember;
GridViewMembers.DataBind();
}
J'ai beaucoup lu, il y a surement des optimisations possibles à ce code, dites moi.
Quand je suis tombé là dessus, j'ai crié : Euréca ! Alors je pense que cela pouvoir servir à vous aussi.
Have fun in ASP.NET C# Development !
Mais n'abusez pas des jointures dans le code C# ce n'est pas optimum.
Sans vous commander, j'ai besoin de flux ici :
Questionnaire en ligne