2010-02-26 6 views
2

Voici mon scénario: Nous avons un système hérité qui a environ 100 vues qui tirent toutes les mêmes colonnes de données.LINQ - 100 vues - mêmes colonnes - requêtes génériques

Maintenant, dans mon DataContext j'ai toutes les vues dans le contexte et j'ai une requête séparée de chacun. Les résultats de chaque requête sont chargés dans une seule liste renvoyée à l'application.

Est-il possible d'avoir une seule requête que je peux passer dans un objet pour savoir de quelle table tirer?

Exemple:

var query = from GenericTable.Where(whereClause).Select(ObjectMap); 

Note: Je sais que ce n'est pas la bonne syntaxe, il est juste par exemple.

Mon but principal est d'éviter d'avoir à écrire 100 requêtes différentes quand elles sont toutes pareilles, juste pointer vers une vue différente à chaque fois.

Toutes les suggestions sont les bienvenues, même si c'est pour garder les 100 requêtes.

Merci!

+0

Pouvez-vous ajouter une autre vue du système? Si c'est le cas, vous pouvez créer une vue principale qui expose une colonne discriminante. –

+0

@Isaac - Idée intéressante, je vois d'où vous venez, et cela peut aussi fonctionner. – CodeLikeBeaker

Répondre

2

Créez une interface commune pour tous les types de mappage générés par linq to sql. Utilisez ensuite des définitions de classes partielles pour ajouter l'interface à toutes les classes.

Ensuite, écrivez vos 100 requêtes comme ceci:

public IQueryable<T> GetQueryAgainst<T>(IQueryable<T> source, 
    string search) where T : IMyData 
{ 
    IQueryable<T> result = source.Where(t => t.Name.Contains(search)); 
    return result; 
} 

et l'appeler comme:

List<Car> cars = GetQueryAgainst(dc.Cars, "Bob").ToList(); 
List<People> people = GetQueryAgainst(dc.People, "Bob").ToList(); 
List<Orders> orders = GetQueryAgainst(dc.Orders, "Bob").ToList(); 
+0

Merci David, c'est ce que je cherchais! – CodeLikeBeaker

0

Une approche peut utiliser Dynamic Linq. Vous pouvez ensuite spécifier la clause where et la sélection à l'aide de chaînes.

var genericList = GetView("predicate to identify view"); 
genericList.Where("field1 = @1", value1).select("Field1, Field2"); 
+0

Mais la vue doit également être dynamique. J'ai pensé que je pourrais utiliser des génériques et transmettre le nom de la vue et la question hors de cela. Pensées? – CodeLikeBeaker

+0

Que voulez-vous dire par "la vue a besoin aussi dynamique"? Dans ma réponse, genericList pourrait être l'un de vos points de vue. Comme les noms de champs sont les mêmes pour chaque vue, Dynamic Linq vous permet de spécifier les clauses where et select sans connaître le type concret de la vue. Tant que les noms des champs sont les mêmes que dans la vue, la requête doit être exécutée. – AxelEckenberger