J'ai jeté ce code parce que cela a fonctionné, mais j'ai vraiment besoin de refactoriser quelque chose d'acceptable. Il accepte un ensemble d'objets de requête (chaînes ressemblant à productid = 3) puis les ajoute à ma requête. Cela ne fonctionne que pour AND logique, mais j'aurai éventuellement besoin de quelques opérateurs logiques différents (OR, NOT).Entity Framework 4 et Linq to Entities spécifications: Comment le coder?
-- Idea here is add the where clause to the original query and return a new one
private static IQueryable<Product> GetFilteredQuery(string condition,
IQueryable<Product> originalQuery)
{
-- REPETITION
if(-- Regex comparison looking for "productid = 123" --)
{
returnQuery = originalQuery.Where(
p => p.myEntity.SelectMany(q => q.subEntity) // spec expression
.Any(r => r.id == foundid));
}
... (one if statement for each specification, calling this several times)
J'ai aussi ce pour la commande:
private static IQueryable<Product> GetOrderedQuery(IList<string> fields,
IQueryable<Product> originalQuery)
{
var resultQuery = originalQuery;
bool firstTime = true;
foreach(var field in fields)
{
-- REPETITION
if(field == "id")
{ if(firstTime == true)
{ resultQuery = resultQuery.OrderBy(p => p.id);
firstTime = false;
}
else
{ resultQuery = resultQuery.ThenBy(p => p.id);
}
}
... (one for each field to order by)
}
Alors, comment pourrais-je résumer chaque répétition pour un objet de spécification où je peux en quelque sorte joindre cette collection de spécifications à ma requête d'origine, y compris l'ordre expressions? C'est sous Linq to Entities, Entity Framework 4 et parapluie C#.
Ce serait vraiment bien de faire quelque chose comme ça, ce qui est essentiellement ce qui précède.
var originalQuery = ...;
foreach(var spec in mySpecs)
{ originalQuery = spec(originalQuery); //adds all the where clauses
}
originalQuery = orderSpec(originalQuery); // adds all the order fields
Des liens vers des sites Web, exemple de code, seraient certainement appréciés.
Suis-je le seul qui manque ici le point derrière ces méthodes? Ne serait-il pas plus facile d'autoriser l'appelant à enchaîner les appels LINQ eux-mêmes plutôt que d'essayer de sur-manipuler quelque chose pour le cacher? –
Les champs proviennent du client. Le client est un navigateur Web envoyant JSON d'avant en arrière. Je devrai passer en revue chaque fourni par le client et l'implémenter. –
Qu'en est-il de la désérialisation de l'objet JSON en .NET (appelons cela les conditions de recherche), puis de la construction de Linq en entités pour une structure de conditions de recherche bien connue? –