2010-11-16 22 views
2

Je tente de recréer une couche d'accès aux données qui a été créée à l'origine à l'aide de Raptier. Raptier génère des méthodes qui acceptent une clause where en tant que paramètre à transmettre à un proc stocké. J'ai vraiment besoin de conserver les signatures existantes, donc mon nouveau DAL doit accepter les clauses where. Je veux utiliser les technologies et les techniques d'accès aux données les plus à jour, alors je pensais à utiliser Entity Framework à partir de .Net 4.0. Cependant, il ne semble pas que je puisse accepter des clauses dynamic where sans implémenter des routines intenses pour les analyser en expressions lamba. Y a-t-il quelque chose que j'ai manqué? Est-ce que je n'ai pas de chance avec Entity Framework?Utilisation de clauses dynamiques where dans Entity Framework

Merci, Marc

+3

Peut-être que vous devriez nous montrer du code. Je ne pense pas que beaucoup de gens sachent à quoi ressemble Raptier stuf. – Steven

Répondre

7

Deux idées viennent à l'esprit.

1). Dynamic LINQ, qui vous permet de définir où les opérateurs en tant que chaînes.

var result = Northwind.Products 
    .Where("CategoryId=2 And UnitPrice>3") 
    .OrderBy("SupplierId"); 

2). Utilisez quelque chose comme EntityFilter<T> (voir code here), qui vous permet de définir un filtre comme ceci:

IEntityFilter<Person> entityFilter = 
    from person in EntityFilter<Person>.AsQueryable() 
    where person.Name.StartsWith("a") 
    where person.Id < 100 
    select person; 

Vous pouvez fournir la IEntityFilter<Person> à une méthode commerciale qui sera en mesure de filtrer cette requête:

public static Person[] GetAllPersons(
    IEntityFilter<Person> filter) 
{ 
    using (var db = ContextFactory.CreateContext()) 
    { 
     IQueryable<Person> filteredList = 
      filter.Filter(db.Persons); 

     return filteredList.ToArray(); 
    } 
} 
+1

L'option 1 de Steven ressemble le plus à ce que nous faisons maintenant. Cela pourrait bien fonctionner! Merci à tous pour vos réponses! – MCalder

+0

Dynamic LINQ semble vraiment soigné. –

0

Découvrez le post blog de Rick Strahl ici: http://www.west-wind.com/weblog/posts/160237.aspx. Sa démo utilise Linq to SQL mais ce ne serait pas très différent dans EF. Cette approche implique l'exposition de IQueryable à la couche de gestion. Ce n'est pas sans controverse, mais c'est quelque chose à considérer.

Avec IQueryable exposé, vous pouvez écrire des requêtes LINQ sur la collection retournée. Je ne promets pas que vous serez en mesure de le faire fonctionner avec des sprocs, mais essayez-le.

0

visage même problème ,, maintenant raptier pourrait être interrompu si bien ,,

j'ai un indice ,, comme je suis en utilisant la version Lite qui supporte seulement 15 tables/vues .. est ici un raccourci, ,

toujours prendre un db test factice dans le serveur ,, et générer les classes que vous voulez, puis fusionner avec votre solution de bibliothèque de classes, reconstruire la solution, et passer à autre chose comme ça dans la mesure où vous voulez ,,

son laborieux mais son travail.

besoin de plus d'aide, avec plaisir ...