2009-08-03 9 views
2

J'utilise Linq to Sql avec Predicate Builder et j'essaie d'optimiser la quantité d'informations extraites de la base de données. Je voudrais sélectionner seulement certains champs pour les afficher dans une grille. Lorsque je sélectionne uniquement ce que je veux, les paramètres de recherche que j'ajoute (voir ci-dessous) ne fonctionnent pas, pas plus que PredicateBuilder. Voici ce que je suis en train de faire (qui fonctionne, mais obtient tout ce qui est beaucoup trop d'info)Linq to Sql - Sélectionnez uniquement certaines informations (avec Predicate Builder)

' Initial Setup ' 
    Dim db As New MyDataContext() 
    Dim results = From p In db.Products _ 
        Select p 

    ' Search ' 
    If (testCase) Then 
     results = results.Where(Function(p) p.SomeAttribute = 123) 
    End If 

Si je change que seulement sélectionner ce que je dois, comme ceci:

Dim results = From p In db.Products _ 
        Select p.Name, p.SomethingElse 

puis J'ai remarqué que si l'information est sélectionnée (ie je sélectionne p.SomeAttribute) alors je peux chercher (ajouter la clause where) sur cet attribut, mais si ce n'est pas le cas, je ne peux pas. Et avec le constructeur de prédicat, cela ne fonctionne que si je sélectionne l'ensemble de l'élément (c'est-à-dire que je sélectionne p). Tout ce qui devrait être fait est de créer des instructions SQL qui n'ont pas à sélectionner l'attribut à rechercher par lui. Comment puis-je faire en sorte que cela fonctionne et que je sélectionne seulement ce dont j'ai besoin, mais que je recherche par n'importe quoi et que je continue à travailler sur un constructeur de base? Toute aide BEAUCOUP APPRECIEE! Merci

Répondre

1

Vous pouvez essayer de faire d'abord un "select p" au début, puis ajouter toutes vos clauses where, et à la toute fin, sélectionnez exactement ce dont vous avez besoin.

' Initial Setup ' 
Dim db As New MyDataContext() 
Dim results = From p In db.Products _ 
       Select p 

' Search ' 
If (testCase) Then 
    results = results.Where(Function(p) p.SomeAttribute = 123) 
End If 

' trim down the columns after you've added the wheres... 
Dim results2 = from p in results 
       Select p.Name, p.SomethingElse 
+0

Salut, je l'avais déjà essayé et il donne cette erreur: Impossible de lancer l'objet de type 'System.Data.Linq.DataQuery'1 [VB $ AnonymousType_0'3 [System.Int32, System.Int32, System .String]] 'pour taper' System.Linq.IQueryable'1 [MyNamespace.Product] '. Des idées autour de celui-là? – Ryan

+0

Il y avait un bogue dans mon exemple qui donnerait cette erreur - j'ai mis à jour l'exemple pour le réparer. –

+0

Je l'ai eu juste après avoir commenté cela, désolé. Mais votre solution est exactement ce que je cherchais. Merci! – Ryan

1

Vous ne pouvez pas modifier la "liste de sélection" (c'est ainsi que j'ai compris votre question, je l'ai peut-être mal comprise) avec le générateur de prédicat (qui construit des expressions booléennes). Vous devez manuellement utiliser des trucs dans l'espace de noms System.Linq.Expressions pour le faire, mais je suggère d'utiliser Dynamic LINQ à la place.

0

Il semble que vous fassiez l'objet sur la projection et non sur le produit original. Faites la projection Sélectionnez p.Name, p.SomethingElse à la fin après que tous les critères de recherche ont été appliqués.

+0

Hey, j'ai essayé ce que je pense que vous dites (si c'est comme la réponse ci-dessus) pour tout sélectionner après que je l'ai cherché, et je reçois cette erreur: Impossible de lancer l'objet de type 'System.Data.Linq. DataQuery'1 [VB $ AnonymousType_0'3 [System.Int32, System.Int32, System.String]] 'pour taper' System.Linq.IQueryable'1 [MyNamespace.Product] '. Savez-vous comment contourner cela? – Ryan