Ich habe ein Projekt, das mich auffordert, eine so große Suchmaschine zu betreiben, das aber alles dynamisch ist. Ich meine, ich kann ungefähr 0 bis 9 Haupt- "Gruppen" haben, die so etwas wie eine unendliche Möglichkeit von "wo" mit "ODER" oder "UND" enthalten. Wir dachten zunächst, Dynamic Linq zu verwenden, das eine gute Alternative zum Erstellen dynamischer Abfragen darstellt. All dies mit EF mit einer hausgemachten Verpackung.
Probleme : Ich kann nicht auf eine "Sammlung" zugreifen. Ich meine, ich kann leicht auf ein referenziertes Objekt zugreifen (wie Customer.State.StateName = "New York" ODER Custoemr.State.StateName = "Quebec" ), aber ich kann keinen Weg finden, auf etwas zuzugreifen wie: " Customer.Orders.OrderID = 2 ODER Customer.Orders.OrderID = 3 " . Ich kann das leicht herausfinden, weil es eine Sammlung ist, aber wie kann ich das tun?
Bitte hilf mir!!
** Entschuldigung für mein Englisch !!
Aktualisieren
Ich bin nicht klar genug, denke ich, tut mir leid, weil ich Franzose bin ...
Mein Problem ist, weil nichts statisch ist. Es ist eine Candidat-Suchmaschine für ein rekrutierendes Unternehmen, das Candidaten in ein Unternehmen einbindet. Auf einer Seite, auf der Manager nach Kandidaten suchen können, kann er nach "Domain (s) (Jobs), City (s) oder vielen anderen" analysieren ", die der Benutzer bei der Registrierung ausgefüllt hat. All dies im Format (wenn es in SQL wäre):
[...] WO (domaine.domainID = 3 ODER domaine.domainID = 5 ODER domaine.domainID = 23) UND (Städte.CityID = 4, Städte.Stadt = 32) [...]
Also kann ich das nicht mit einem normalen LINQ-Format machen wie:
Candidat.Domaines.Where(domain => domain.DomainID == 3 || domain.DomainID == 5 || domain.DomainID == 23);
Sogar der Operator in den Parethesen ist dynamisch ("UND" oder "ODER")! Deshalb versuchen wir, Dynamic Linq zu verwenden, weil es viel flexibler ist.
Hoffe, es ist einfacher, mein Problem zu verstehen ...
Update 2 Hier ist meine Methode
private string BuildDomainsWhereClause() {
StringBuilder theWhere = new StringBuilder();
if (this.Domaines.NumberOfIDs > 0) {
theWhere.Append("( ");
theWhere.Append(string.Format("Domaines.Where( "));
foreach (int i in this.Domaines.ListOfIDs) {
if (this.Domaines.ListOfIDs.IndexOf(i) > 0) {
theWhere.Append(string.Format(" {0} ", this.DispoJours.AndOr == AndOrEnum.And ? "&&" : "||"));
}
theWhere.Append(string.Format("DomaineId == {0}", i));
}
theWhere.Append(" ))");
}
return theWhere.ToString();
}
Es funktioniert stattdessen großartig, dass es "keinen Booleschen Wert zurückgibt". Wie soll ich also? Fehler: "Ausdruck vom Typ 'Boolean' erwartet".
Am Ende wird etwa Folgendes zurückgegeben: "(Domaines.Where (DomaineId == 2 && DomaineId == 3 && DomaineId == 4 && DomaineId == 5))." welches meiner LINQ-Abfrage hinzugefügt wird:
var queryWithWhere = from c in m_context.Candidats.Where(WHERE)
select c;
Vergessen Sie nicht, dass es 7 oder 8 weitere "mögliche" hinzugefügte Dinge gibt, in denen gesucht werden kann ... Irgendwelche Ideen?
Was Sie hier tun müssen, ist eine LambdaExpression zu erstellen (genauer gesagt ein Expression<Func<T, bool>>
). Sie können keine Zeichenfolge verwenden. Sie können einen einfachen Ausdruck wie folgt erstellen:
ParameterExpression p = Expression.Parameter(typeof(Domaine), "domaine");
Expression<Func<Domaine, bool>> wherePredicate =
Expression.Lambda<Func<Domaine, bool>>(
Expression.Or(
Expression.Equal(
Expression.Property(p, "DomainID"),
Expression.Constant(10)),
Expression.Equal(
Expression.Property(p, "DomainID"),
Expression.Constant(11))
), p);
dh
domaine.DomainID = 10 || domaine.DomainID = 11
Nicht sehr gut lesbar, wenn Sie dies von Hand tun müssen.
Es gibt ein Beispiel für einen voll funktionsfähigen Ausdrucksparser, der dies basierend auf einer Zeichenfolge in C # -Beispielen für Visual Studio 2008 in der MSDN Code Gallery unter DynamicQuery für Sie erledigt . (Das LinqDataSource
Steuerelement verwendet intern eine leicht geänderte Version dieses Beispiels.)
Endlich habe ich es genau so, wie ich es will.
private string BuildDomainsWhereClause() {
StringBuilder theWhere = new StringBuilder();
if (this.Domains.NumberOfIDs > 0) {
theWhere.Append("( ");
foreach (int i in this.Domains.ListOfIDs) {
if (this.Domains.ListOfIDs.IndexOf(i) > 0) {
theWhere.Append(string.Format(" {0} ", this.Domains.AndOr == AndOrEnum.And ? "&&" : "||"));
}
theWhere.Append(string.Format("Domains.Any(IdDomaine== {0})", i));
}
theWhere.Append(" )");
}
return theWhere.ToString();
}
Welche produzieren so etwas wie: "(DispoJours.Any (IdDispo == 3) && DispoJours.Any (IdDispo == 5))".
Alle meine anderen "Where Builder" machen die gleichen Dinge mit einem "&&", zwischen denen das richtige Ergebnis erzielt wird.
Und später :
var queryWithWhere = from c in m_context.Candidats.Where(WHERE)
select c;
WHOOOHOOO !! Danke Leute. Waren sehr nützlich! Ich liebe diese Website!
Aktualisieren
Vergessen Sie nicht, dass ich Dynamic Linq für diese Abfrage verwende. Es ist keine normale LINQ-Abfrage.