9
votes

Comment accéder aux données à IQuiserable?

J'ai un objet iquérissable et j'ai besoin de prendre les données à l'intérieur de la certitude pour la mettre dans des contrôles de Textboxs. Est-ce possible?

J'essaie quelque chose comme: P>

public IQueryable getData(String tableName, Hashtable myparams)
{
        decimal id = 0;

        if (myparams.ContainsKey("id") == true)
             id = (decimal)myparams["id"];

        Type myType= Type.GetType("ORM_Linq." + tableName + ", ORM_Linq");

        return this.GetTable(tableName , "select * from Articu where id_tipo_p = '" + id + "'");

}


public IQueryable<T> GetTable<T>(System.Linq.Expressions.Expression<Func<T, bool>> predicate) where T : class
{
    return _datacontext.GetTable<T>().Where(predicate);
}


2 commentaires

Votre anglais est très bien. :)


"Select * de Articu où id_tipo_p =" - cela demande une injection SQL, j'espère que ce n'est pas un code de production que vous écrivez ou que vous avez des moyens de sécurité?


5 Réponses :


8
votes

edit: strong> Mise à jour basée sur des informations supplémentaires à partir de vos autres messages ...

Votre getdata ​​code> est renvoyé iQueryable au lieu d'un résultat fortement tapé, c'est pourquoi Vous finissez par la jeter. Essayez de le changer à: p> xxx pré>

essayez d'interroger "Articu" de différentes tables? P>

avec le changement ci-dessus en place, votre code peut être réécrit comme suit: p> xxx pré>

p>


Si vous avez un seul résultat, utilisez SingleFault qui retournera une valeur par défaut si Aucun résultat n'est renvoyé: p> xxx pré>

Si vous avez plusieurs résultats, puis bouclez-leur: P>

foreach (var item in mydata)
{
   string name = item.ProductName;
   int id = item.ProductId;
   // etc..
}


5 commentaires

Ne voulez-vous pas dire: Nom de la chaîne = item.productname; INT id = item.productid;


J'utilise la même méthode pour beaucoup de tables, c'est pourquoi je n'utilise pas de résultat fortement typé. Donc, je dois me lancer à chaque fois, pas? Merci


@ @Mark Oui, dans ce cas, vous auriez besoin de jeter comme vous le faisiez. Si votre instruction SELECT allume toujours un objet orm_linq.articu , vous pourriez aussi bien le faire iquéryable . Néanmoins, vous devriez suivre l'approche démontrée ci-dessus pour capturer le résultat à l'aide de SingleFault () pour le gérer correctement au cas où le résultat est null.


Merci et tout le monde. Est vraiment difficile après 5 ans de travail sur Visual FoxPro Apprenez à travailler sur C # et SQL :(


@Mark Si vous n'avez pas encore alors alors suggéré d'avoir la main sur un bon livre Linq. C # / SQL est une chose, Linq à SQL est différent de la traditionnelle Ado.net à l'aide d'un SQLConnection . Je recommande Linq en action de Fabrice Marguerie, Steve Eichert et Jim Wouthey sont disponibles ici: Manning.com/marguerie Pour C #, je suggère PRO C # 2008 et la plate-forme .NET 3.5 ( aperf.com/book/1590598849 ) ou C # 3.0 en un mot de noix ( OREILLY.COM/CATALOG/9780596527570 ) - Ces livres ont de nouvelles éditions 4.0 publiées bientôt.



-1
votes

Si vous n'attendez qu'une seule valeur, appelez simplement FirstArdefault () code> méthode.

public void setdata (IQueryable mydata)
{
    textbox1.text = mydata.FirstOrDefault().PropertyName;
}


1 commentaires

Cela devrait entraîner une erreur de compilation. La méthode de FirstOrdefault ne renvoie pas une valeur de type de type. Essayez, mydata.firstordfault (). PropriétaireName.



0
votes

Eh bien, comme son nom l'indique, un objet implémentant iQueryable est ... Intersable! Vous devrez écrire une requête LINQ pour obtenir aux détails internes de votre objet iquérirable. Dans votre requête LINQ, vous pourrez retirer ses données et assigner des bits de celui-ci où vous le souhaitez - comme votre boîte de texte.

Voici un excellent point de départ pour apprendre Linq .


0 commentaires

2
votes

Tout d'abord, vous devriez utiliser une version fortement typée de iquéryable code>. Dites que vos objets sont de type myObject code> et que myObject code> a une propriété appelée nom code> de type chaîne code>. Ensuite, changez d'abord le paramètre myData ​​code> de type iquéryable code>: xxx pré>

alors nous pouvons écrire un corps comme pour effectivement obtenir des données de. Disons que nous voulons juste que nous voulions juste le premier résultat de la requête: p> xxx pré>

ou, si vous souhaitez concaténer tous les noms: p>

public void setdata(IQueryable<MyObject> mydata) {
    string text = String.Join(", ", mydata.Select(x => x.Name).ToArray());
    textbo1.Text = text;
}


0 commentaires

0
votes

Je pense que vous trouvez la même lutte mentale en venant de FoxPro et de Dataset. De très belles fonctionnalités à base de cordes puissantes (SQL pour la requête, l'accès aux tableaux et aux colonnes Nom) dans ces mondes ne sont pas disponibles, mais sont remplacées par un ensemble de capacités compilé et fortement typé.

Ceci est très agréable si vous définissez statiquement l'interface utilisateur pour la recherche et les résultats s'affichent contre une source de données connue au moment de la compilation. Pas si agréable si vous essayez de créer un système qui attache aux sources de données existantes connues uniquement à l'exécution et définies par des données de configuration.


0 commentaires