Ich arbeite an einer Anwendung, wo ein Benutzer Datensätze nach Kategorien filtern kann.So verbessern Sie die LINQ-Abfrage
Ein Datensatz muss 1 haben, kann aber viele Kategorien haben. (1- *)
Die Frage, die ich habe, ist, was kann ich tun, um diese Suche zu verbessern? Es läuft zur Zeit auf etwa ein O (n^3) aus dem folgenden Grund:
Eine Transaktion kann viele Datensätze (1-many) Ein Datensatz viele Kategorien (1-many) Iterieren durch die ausgewählten Kategorien haben kann für die Suche
die Grundzüge dessen, was ich tue, ist die folgende:
retrieve all announcements
if(startDate and endDate have values)
model = model.Where(x => x.WADate >= start.Value && x.WADate <= end.Value).ToList();
if(queryString is not null)
model = model.Where(
x => x.WANum.Contains(query) ||
x.Tooltip.ToLower(CultureInfo.InvariantCulture).Contains(query)
|| x.Topic.ToLower(CultureInfo.InvariantCulture).Contains(query)
).ToList();
if (selectedCategories.Count > 0)
{
bool HasMatch;
foreach (var ancmt in announcements)
{
HasMatch = false;
foreach (var cat in selectedCategories)
{
foreach (var xref in ancmt.waXref)
{
if (cat.ID == xref.WACategoryID)
{
HasMatch = true;
}
}
}
if(HasMatch)
{
model.Add(new EditViewModel
{
WATypeID = ancmt.WATypeID,
WANum = ancmt.WANum,
WATypeName = ancmt.waType.WATypeDescription,
Link = ancmt.Link,
Tooltip = ancmt.Tooltip,
Topic = ancmt.Topic,
WADate = ancmt.WADate,
WAID = ancmt.WAID,
});
ancmt.waXref.ToList().ForEach(
x => model.Last().Categories.Add(
new CategoryViewModel { ID = x.WACategoryID, Name = x.waCategory.WACategory, IsSelected = false }));
}
}
}
// If no catgories were selected, keep all announcements for next stage of search
else
{
foreach (var ancmt in announcements)
{
model.Add(new EditViewModel
{
WATypeID = ancmt.WATypeID,
WANum = ancmt.WANum,
WATypeName = ancmt.waType.WATypeDescription,
Link = ancmt.Link,
Tooltip = ancmt.Tooltip,
Topic = ancmt.Topic,
WADate = ancmt.WADate,
WAID = ancmt.WAID,
});
ancmt.waXref.ToList().ForEach(
x => model.Last().Categories.Add(
new CategoryViewModel { ID = x.WACategoryID, Name = x.waCategory.WACategory, IsSelected = false }));
}
}
I Methode Syntax verwende, nicht zu bleiben in der Methode Syntax abfragen und bevorzugen.
Das sieht für mich nicht wie eine Linq-Abfrage aus. –
Es ist schwer zu sagen, nur aus dem Code, was das erwartete Ergebnis der "Abfrage" sein sollte. Es sieht so aus, als würdest du nur einen Übereinstimmungsmerker für jeden Datensatz setzen. Führen Sie stattdessen eine tatsächliche Linq-Abfrage aus. –
Realer Code hinzugefügt @RobertHarvey – Ingenioushax