Ich habe diesen Code runtergeworfen, weil es funktioniert hat, aber ich muss wirklich etwas akzeptables umgestalten. Es akzeptiert eine Reihe von Abfrageobjekten (Zeichenfolgen, die wie ProductID = 3 aussehen) und fügt sie dann zu meiner Abfrage hinzu. Dies funktioniert nur für logisches AND, aber ich brauche eventuell ein paar verschiedene logische Operatoren (ODER, NICHT).Entity Framework 4 und Linq to Entities Spezifikationen: Wie wird es codiert?
-- 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)
ich dies auch für die Bestellung haben:
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)
}
Wie konnte ich jede Wiederholung in einer Spezifikation Objekt kapseln, wo ich irgendwie diese Sammlung von Spezifikationen zu meiner ursprünglichen Abfrage anhängen können, einschließlich der Bestellung Ausdrücke? Dies ist unter den Linq to Entities, Entity Framework 4 und C# Regenschirm.
Es wäre wirklich nett, so etwas zu tun, was im Wesentlichen das oben genannte ist.
var originalQuery = ...;
foreach(var spec in mySpecs)
{ originalQuery = spec(originalQuery); //adds all the where clauses
}
originalQuery = orderSpec(originalQuery); // adds all the order fields
Links zu Websites, Beispielcode, würde sicherlich geschätzt werden.
Bin ich der einzige hier man den Punkt hinter diesen Methoden fehlt? Wäre es nicht einfach, dem Anrufer zu erlauben, die LINQ-Anrufe selbst zu verketten, anstatt zu versuchen, etwas überzuentwickeln, um es vor ihnen zu verbergen? –
Die Felder kommen vom Client. Der Client ist ein Webbrowser, der JSON hin und her sendet. Ich werde durch jeden vom Kunden zur Verfügung gestellten Zyklus radeln und es implementieren müssen. –
Was ist mit der Deserialisierung von JSON zu .NET-Objekt (lassen Sie es Suchbedingungen aufrufen) und erstellen Sie dann Linq to Entities Abfrage für wohlbekannte Suchbedingungen Struktur? –