Die folgende LINQ Aussage:Warum erhält diese LINQ-zu-SQL-Abfrage eine NotSupportedException?
public override List<Item> SearchListWithSearchPhrase(string searchPhrase)
{
List<string> searchTerms = StringHelpers.GetSearchTerms(searchPhrase);
using (var db = Datasource.GetContext())
{
return (from t in db.Tasks
where searchTerms.All(term =>
t.Title.ToUpper().Contains(term.ToUpper()) &&
t.Description.ToUpper().Contains(term.ToUpper()))
select t).Cast<Item>().ToList();
}
}
gibt mir diese Fehler:
System.NotSupportedException: Lokale Sequenz nicht in LINQ verwendet werden kann Implementierung von Abfrageoperatoren außer auf SQL der Operator Contains().
drum herum Blick scheint meine einzige Option alle meine Artikel erste in eine generische Liste zu bekommen, dann eine LINQ-Abfrage auf das tun.
Oder gibt es eine clevere Möglichkeit, die obige LINQ-to-SQL-Anweisung umzuformulieren, um den Fehler zu vermeiden?
ANTWORT:
Dank Randy, Ihre Idee hat mir geholfen, die folgende Lösung zu erstellen. Es ist nicht elegant, aber es löst das Problem und da dies Code generiert wird, kann ich bis zu z. 20 Suchbegriffe ohne zusätzliche Arbeit:
public override List<Item> SearchListWithSearchPhrase(string searchPhrase)
{
List<string> searchTerms = StringHelpers.GetSearchTerms(searchPhrase);
using (var db = Datasource.GetContext())
{
switch (searchTerms.Count())
{
case 1:
return (db.Tasks
.Where(t =>
t.Title.Contains(searchTerms[0])
|| t.Description.Contains(searchTerms[0])
)
.Select(t => t)).Cast<Item>().ToList();
case 2:
return (db.Tasks
.Where(t =>
(t.Title.Contains(searchTerms[0])
|| t.Description.Contains(searchTerms[0]))
&&
(t.Title.Contains(searchTerms[1])
|| t.Description.Contains(searchTerms[1]))
)
.Select(t => t)).Cast<Item>().ToList();
case 3:
return (db.Tasks
.Where(t =>
(t.Title.Contains(searchTerms[0])
|| t.Description.Contains(searchTerms[0]))
&&
(t.Title.Contains(searchTerms[1])
|| t.Description.Contains(searchTerms[1]))
&&
(t.Title.Contains(searchTerms[2])
|| t.Description.Contains(searchTerms[2]))
)
.Select(t => t)).Cast<Item>().ToList();
default:
return null;
}
}
}
Beachten Sie, dass dies kein Fehler "nicht implementiert" ist, es ist ein Fehler "lokale Sequenz kann nicht verwendet werden". – Lucas
danke, behoben, dass –
Ich bin mir nicht sicher, ob ich das richtig lese, es ist eine Menge Klammern, aber ich sehe keine gut gebildete Where-Klausel. Ihre searchTerms.All() gibt eine Liste von Zeichenfolgen zurück, die keine where-Klausel bilden, daher der Fehler. – Lazarus