Ich erstelle eine API mithilfe der Web-API, wobei ich Datenbanktabellen als JSON zurückgebe.Dynamische Web-API-Parameter zum Filtern
Das ist mein Controller-Methode:
public List<ExampleDataDTO> ExampleData(int offset = 0, int limit = 0)
{
return DataAccessLayer.GetExampleData(offset, limit);
}
Data Access-Methode:
public List<ExampleDataDTO> GetExampleData(int offset, int limit)
{
using (var db = new Context())
{
db.Configuration.ProxyCreationEnabled = false;
var exampleQuery = db.example.AsEnumerable().Select(item =>
new ExampleDataDTO
{
//Selects
});
if(offset == 0 && limit == 0)
{
return exampleQuery .ToList();
}
else
{
return exampleQuery .Skip(offset).Take(limit).ToList();
}
}
}
Jetzt enthält die ExampleDataDTO über 100 Dateien, und ich möchte in der Lage sein, Daten mit der API auf ein beliebiges Feld zu filtern .
Gibt es eine Möglichkeit, dynamische Abfrageparameter zu erstellen? Wenn ich beispielsweise zu localhost/api/ExampleData?offset=0&limit=10&name=test1&size=test2
gehe, möchte ich die Schlüssel und Werte für Name und Größe erhalten, um sie in meinen LINQ-Code aufnehmen zu können.
Ist das machbar?
EDIT:
ich alle Parameter als IEnumerable<KeyValuePair<String, String>> queryString
bekommen kann, ist es eine Möglichkeit, den Schlüssel in einem Lambda-Ausdruck zu verwenden i durch alle keyValuePairs Schleife waren? wie Wo (c = c.Key == Value),
foreach(var queryKeyValuePair in queryString)
{
Something including Where(c => c.queryKeyValuePair.Key == queryKeyValuePair.Value)
}
was ist name, test1, größe, test2? Können Sie Ihr DTO-Objekt auch teilen? –
Ich bin mir sicher, dass Sie eine LINQ-Anweisung erstellen können, die alle verschiedenen Permutationen der Anforderungsparameter berücksichtigt, aber Sie möchten auch sicherstellen, dass die SQL, die LINQ generiert, gut funktioniert. Persönlich habe ich es in diesen Fällen besser gefunden, eine SQL-Prozedur zu erstellen, um die möglichen Parameter zu akzeptieren und sicherzustellen, dass sie mit den verschiedenen Kombinationen gut funktioniert. –
Ich sehe, dass Sie ein 'Skip() verwenden. Take()'. Wie ist die Liste geordnet? Ist es möglich, dass sich die Anforderungen ändern, um sie anders anzuordnen, oder im schlimmsten Fall, dass der Benutzer der API sie so anordnet, wie sie es für richtig halten? –