2009-02-02 12 views
0

Je travaille dans le chapitre "Liaison de données" dans WPF Pro en C# 2008.WPF/question de conception de la couche de données LINQ

Ils vous ont mis en place cette classe:

public class StoreDB 
{ 
    public Contact GetContact(int id) {...} 
    public List<Contact> GetContacts() {...} 
} 

L'idée est pour appeler ces méthodes, obtenir un Contact ou un List<Contact> et les lier aux contrôles appropriés en utilisant LINQ sur cette dernière méthode pour filtrer/trier vos objets.

Tout cela a du sens.

Cependant, que se passe-t-il lorsque vous avez 100 000 contacts et que vous voulez en obtenir 3? Votre méthode GetContacts() obtient 100 000 et votre LINQ choisit trois d'entre eux?

N'est-ce pas super inefficace?

Comment les applications du monde réel sont-elles construites pour éviter cela?

Répondre

1

Bienvenue dans le monde Linq!

Vous voulez retourner un IQueryable<Contact>:

public class StoreDB 
{ 
    public Contact GetContact(int id) {...} 

    // change to this: 
    public IQueryable<Contact> GetContacts() {...} 
} 

Maintenant vous pouvez dire cela sans perdre des cycles ou bande passante:

IQueryable<Contact> SerachByFirstName(StoreDB store, string searchParam, int limit) 
{ 
    return store.GetContacts() 
     .Where(c => c.FirstName == searchParam) 
     .Take(limit); 
} 

En fait, ce ne sera toujours pas envoyer une requête à la base de données à moins que vous ne commenciez à énumérer l'IQueryable. Autrement dit, vous pouvez toujours ajouter plus Where() ou OrderBy() ou quoi que ce soit et ils seront fusionnés et envoyés à la source ensemble lorsque la requête est finalement évaluée.


Bien sûr, cela ne vous aide pas à vous lier à l'interface utilisateur. Mais c'est un problème difficile. Vous devez soit exposer EntitySet sous-jacent à WPF, soit utiliser une architecture MVVM (ou similaire) pour séparer l'accès aux données et l'interface utilisateur.

+0

oui, c'est ce que je veux faire, mais les causes ci-dessus "Le type System.Collections.Generic.IEnumerable ne peut pas être converti en System.Linq.IQueryable ". Que dois-je utiliser à côté de la liste , puisque IQueryable ne fonctionne pas parce que c'est abstrait. –

+0

amélioré ma réponse –

1

Je ne connais pas le livre que vous utilisez mais la question ici est quelle base de données utilisez-vous si son SQL alors vous pouvez utiliser LINQ to SQL et ajouter un fichier dbml à votre projet via le concepteur VS, puis faites glisser les contes vouloir utiliser de la vue Sever Explorer sur le dbml et toutes vos classes d'objets bussness seront générées automatiquement. De là, vous pouvez utiliser le dataContex créé et travailler avec linq pour filtrer les résultats avant qu'ils ne soient récupérés.

Ce que vous avez fait en ce moment est de filtrer les objets que vous avez récupérés par différents moyens.

HTH, Eric

1

Puisque vous avez demandé mai WPF et quetions LINQ je pensais que vous voulez vraiment jeter un oeil à un bon vido traning pour WPF et LINQ ou ADO.net,

C'est une excellente source pour commencer à apprendre très directement.

Vido Traning WPF

HTH, Eric

2

Je recommande un design qui ne pas ont GetContacts retour Liste <T>. Je ne suis pas entièrement sûr que vous souhaitez utiliser la liste <T> parce que la collection que vous renvoyez est modifiable. Dans WPF, si vous voulez vraiment une liste modifiable d'éléments, essayez ObservableCollection <T>.

Cependant, je pense que la meilleure interface retournerait un IEnumerable <T> qui est le résultat de votre requête SQL ou LINQ. Cela fournira une collection immuable de vos contacts au classeur, qui peut être filtré avec LINQ to Objects simplement et facilement.

+0

Est-ce que IEnumerable renvoie les données en une seule fois ou agit-il comme IQueryable et traite uniquement les données lors de l'accès? –

+0

IEnumerable l'accès aux données est basé sur l'implémentation. Cela pourrait être différé ou cela pourrait être immédiat. – user7116

Questions connexes