Okay, ich hatte vor, eine Anzeige zu veröffentlichen, aber dann dachte ich, wenn ich einen reinen Werbebeitrag poste, werden sicher viele Flüche und Steine und Eier herumfliegen Nun, setzen Sie den DAC ein. Bezüglich benutzerdefiniertem LINQ Lassen Sie mich den Code erklären, der Ausdrücke unterstützt. Vielleicht ist er für einige Leute hilfreich, die ihre eigene Datenschicht schreiben oder einige praktische LINQ-Erweiterungen schreiben möchten als „Vorschlag“ dienen, wäre das nicht toll!
In früheren Versionen von DAC wurde der folgende Ausdruck zur Abfrage verwendet:
IEnumerable<Issue> q = this.dc.Query<Issue>(Issue._.IssueID >= 0);
Dieses „süße“ „_“ scheint so „unreif“ zu sein, insbesondere in dieser Zeit des grassierenden LINQ, dass es sehr „mit der Zeit gehen“ zu sein scheint. Es gibt also die Version 2.6, die die DAC-Erweiterung LINQ unterstützt.
var q = this.dc.Query<Issue>(s => s.IssueID > 0);
oder
var q = from s in (this.dc.GetQueryableData<Issue>())
wobei s.IssueID > 0 ist
s auswählen;
Die Implementierung der beiden oben genannten Methoden basiert hauptsächlich auf dem Parsen von Ausdrücken und dem Zusammenstellen von SQL-Anweisungen. Der Beitrag von Lao Zhao ist sehr gut geschrieben und Sie können sich auch den Quellcode von DAC ansehen (ich füge Werbung ein).
Was ich heute hauptsächlich sagen möchte, ist: Wenn wir ursprünglich über einen eigenen Ausdrucksbaum und seine Analysefunktion verfügen, können wir ihn dann problemlos auf die Unterstützung von LINQ „aktualisieren“? ! Ja, es ist einfach!
var q = von s in SystemUser._
wobei s.FullName == s.FullName.Max
orderby s.UserID
select s.Except(s.Password);
Damit ein Objekt „where“, „orderby“ oder „select“ sein kann, lassen Sie es Methoden mit den Namen „Where“, „OrderBy“, „Select“ implementieren oder verwenden Sie die Methode „Extension Method“, genau wie in DAC:
öffentliche statische Klasse QueryExpressionExtension
{
public static RaisingStudio.Data.Expressions.IQueryExpression<T> Where<T>(
diese RaisingStudio.Data.Expressions.IQueryExpression<T>-Quelle,
Expression<Func<T, RaisingStudio.Data.Expressions.ConditionExpression>>-Prädikat)
{
return (new RaisingStudio.Data.Expressions.QueryExpression<T>(
Quelle.Wert,
Quelle.Tabelle,
(predicate.Compile())(source.Value),
source.Columns));
}
öffentliches statisches RaisingStudio.Data.Expressions.IQueryExpression<T> OrderBy<T>(
diese RaisingStudio.Data.Expressions.IQueryExpression<T>-Quelle,
Expression<Func<T, RaisingStudio.Data.Expressions.ColumnExpression>>-Prädikat)
{ … }
public static RaisingStudio.Data.Expressions.IQueryExpression<T> Select<T>(
diese RaisingStudio.Data.Expressions.IQueryExpression<T>-Quelle,
Ausdruck<Func<T, Objekt>> Prädikat)
{ ... }
}
Rufen Sie bei der Implementierung der Methode die Compile-Methode für den eingehenden „System“-Ausdruck auf, um den „benutzerdefinierten“ Ausdruck zurückzugeben, und speichern Sie diese „benutzerdefinierten“ Ausdrücke dann im „QueryExpression“ ), wenn die „Abfrage“ ausgeführt wird. Der gespeicherte „benutzerdefinierte“ Ausdruck kann direkt herausgenommen werden. Auf diese Weise kann die Abfrage mithilfe der ursprünglichen Analyse des „benutzerdefinierten“ Ausdrucks im obigen Code implementiert werden. ! !