8
votes

Return Object personnalisé à partir de la structure d'entité et attribuer à la source de données d'objet

J'ai besoin de conseils avec un problème, j'utilise l'entité Framework 4.0, j'ai une DAL et BLL et je suis obligatoire pour ObjectDataSource sur la page.

J'ai dû écrire une procédure stockée à l'aide de pivot code> et dynamique SQL pour renvoyer les données de plusieurs entités comme je veux. Maintenant, j'essaie de comprendre comment puis-je obtenir l'entité framework pour renvoyer un objet personnalisé que je peux lier à mon ObjectDatasource code> sur la page, j'ai besoin d'utiliser un objet personnalisé ou un objet dynamique depuis le stockage stocké. la procédure peut renvoyer n'importe quel nombre de colonnes afin que je ne puisse pas utiliser une classe ou une entité fortement dactylographiée et je dois également être capable de le lier avec un objet objetDatasource code>. p>

Quelqu'un peut-il pointer Un bon moyen de faire cela et de définir ma fonction? Avec quelques exemples de code s'il vous plaît. P>

J'ai lu que je devrais essayer d'utiliser list code> pour renvoyer un objet car ef ne prend pas en charge les fichiers de données / jeux de données, j'ai ce qui suit Jusqu'à présent, mais je sais que ce n'est pas correct. P>

Je n'ai pas beaucoup travaillé avec des génériques beaucoup, si vous pouviez indiquer comment faire cela, je suis sûr que cela serait utile pour beaucoup de personnes. Veuillez fournir des exemples de code pour la fonction et comment lier objetdatasource code> à l'objet de retour? P>

Votre aide est grandement appréciée !! p>

Merci pour votre aide Richard C'est ce que ma fonction ressemble maintenant à votre suggestion d'utilisation de dbdatarecord em>

C # Fonction pour ObjectDataSource Code> dans DAL P>

<asp:ObjectDataSource ID="ODSProductAvailability" runat="server"
        TypeName="Project.BLL.ProductBL" 
        SelectMethod="GetData"  >
     <SelectParameters>
        <asp:SessionParameter Name="product_id" SessionField="ProductID" />
     </SelectParameters>
</asp:ObjectDataSource>


2 commentaires

Bonjour, comment avez-vous résolu votre problème? Le type de résultat 'system.data.common.dbdatarecord' peut ne pas être abstrait et doit inclure un constructeur par défaut


Vous ne pouvez pas utiliser dbdataRecord avec exécutantestorequery. Si vous ne pouvez pas définir les colonnes renvoyées par la requête, vous devez utiliser SQLDatreader. Si vous êtes capable de définir les colonnes renvoyées, créez une classe et utilisez-la pour matérialiser la requête.


3 Réponses :


4
votes

Si vous avez déjà un type d'entité qui correspond à votre type de retour Proc, utilisez-le comme paramètre Type.

using (SqlConnection connection = new SqlConnection("your connection string"))
{
    SqlCommand command = new SqlCommand(
      "exec spGetProductsByGroup @ProductID",
      connection);
    command.Parameters.Add(product_id);

    connection.Open();

    SqlDataReader reader = command.ExecuteReader();

    List<ProcType> list = new List<ProcType>();
    if (reader.HasRows)
    {
        while (reader.Read())
        {
            list.Add(new ProcType(){Property1 = reader.GetInt32(0), Property1 = reader.GetString(1));
        }
    }
    reader.Close();

    return list;
}


2 commentaires

Non, c'est le problème que le Proc stocké obtient des données de plusieurs entités et l'affiche dans un format différent, je ne peux pas le retourner avec un type d'entité, avez-vous des exemples d'utilisation de digne d'information comme vous avez mentionné? Ou existe-t-il un meilleur moyen de générer CustomObject à partir des résultats de retour Proc?


Je ne suis pas sûr de l'utilisation d'un type de non-entité, mais j'ai ajouté un exemple de datareader. Voir le lien ci-dessus pour des exemples plus généraux.



4
votes

Qu'en est-il de quelque chose comme ceci: xxx


0 commentaires

0
votes

Si vous souhaitez présenter les résultats en disant une grille de grille, vous êtes presque là-bas, vous êtes presque là-bas - avec les colonnes de liaison et d'autogénère, car l'objetQuisery est un iNeumable. J'utilise l'objetQuisery mais vous pouvez échanger cela avec exécucestorequerery - car ils renvoient tous deux un iNaumerable xxx pré>

dans xaml p> xxx pré>

et vous 'LL Voir les colonnes qui sont renvoyées directement dans l'interface utilisateur. p>

Si vous n'utilisez pas WPF et que vous souhaitez une liste em> de vos éléments, tout ce que vous avez à faire est: P>

foreach (var rec in context.ExecuteStoreQuery<DbDataRecord>("exec spGetProductsByGroup @ProductID={0}", product_id))
    {
    for (var ri = 0; ri < rec.FieldCount;ri++)
    {
        Console.WriteLine(rec.GetDataTypeName(ri)
                          +"   " + rec.GetName(ri)
                          +" = " + rec.GetValue(ri));
        }
    }


5 commentaires

Merci pour votre réponse Richard j'ai essayé de faire votre suggestion pour Var MyList = Context.ExecutestoreQuery ("EXEC SPGETPRODUCTSBROUPT @ productid = {0}", produit_id); Mais cela me donne une erreur disant le type de résultat 'system.data.common.dbdatarecord' peut ne pas être abstrait et doit inclure un constructeur par défaut. Je n'utilise pas WPF BTW, il s'agit d'une page ASP.NET, veuillez consulter mon message ci-dessus pour une mise à jour de la fonction de fonction et de la source de données d'objet afin que vous sachiez ce que j'ai, merci encore pour votre aide.


@Shokwave pour créer la liste DO DISPONIBLESPRODUCTS = groupdata.tolist (); - Vous n'avez pas besoin de le dire le type qu'il va le comprendre.


Ok c'est bon mais à quoi ressemble la signature de la fonction dans la classe DAL Classe et de la couche d'entreprise? Jusqu'à présent, j'ai essayé la liste getproductsbyroup (int client_id) et liste getAvailabilyCargroups (int client_id) Où T: dbdatarecord mais aucun de ces travaux


Liste getomedata ()


J'ai essayé la signature de la fonction comme vous l'avez mentionnée et cela me donne toujours l'erreur suivante Var Var MyList = Context.ExecutestoreQuery ("Exec Spgeductsbygroup @ productid = {0}", produit_id); Me donne une erreur disant le type de résultat 'System.Data.common.dbdatarecord' peut ne pas être abstrait et doit inclure un constructeur par défaut, j'ai même essayé d'utiliser context.execuestoreQuery > ("Exec Spgeducductsbygroup @ productid = {0 {0}" , produit_id); aussi bien et il construit bien mais la page jette une référence d'objet d'erreur ne peut pas être trouvée