D'accord, je vais le faire. J'avais prévu de publier une annonce, mais ensuite j'ai pensé que si je publie un article purement publicitaire, je suis sûr qu'il y aura beaucoup de malédictions, de briques et d'œufs qui voleront partout. bien mettre le DAC. Concernant LINQ personnalisé Laissez-moi vous expliquer le code qui prend en charge les expressions. Peut-être que cela sera utile à certaines personnes qui écrivent leur propre couche de données ou qui souhaitent écrire des extensions LINQ pratiques. Même si cela n'est pas utile, cela le sera. servir de "suggestion", ne serait-ce pas génial !
Dans les versions précédentes de DAC, l’expression suivante était utilisée pour interroger :
IEnumerable<Issue> q = this.dc.Query<Issue>(Issue._.IssueID >= 0);
Ce "mignon" "_" semble tellement "immature", surtout à l'ère de LINQ endémique, il semble très "évoluer avec son temps". Il existe donc une version v2.6 qui prend en charge l'extension DAC LINQ.
var q = this.dc.Query<Issue>(s => s.IssueID > 0);
ou
var q = de s dans (this.dc.GetQueryableData<Issue>())
où s.IssueID > 0
sélectionnez s ;
L'implémentation des deux méthodes ci-dessus repose principalement sur l'analyse d'expressions et l'assemblage d'instructions SQL. Le post de Lao Zhao est très bien écrit, et vous pouvez également consulter le code source de DAC (j'insère des publicités).
Ce que je veux principalement dire aujourd'hui, c'est que si nous avons à l'origine notre propre arbre d'expression et sa fonction d'analyse, pouvons-nous facilement le « mettre à niveau » pour prendre en charge LINQ ? ! Oui, c'est facile !
var q = de s dans SystemUser._
où s.FullName == s.FullName.Max
commander par s.UserID
sélectionnez s.Except(s.Password);
Pour permettre à un objet d'être "where", "orderby", "select", puis laissez-le implémenter des méthodes nommées "Where", "OrderBy", "Select", ou utilisez la méthode Extension Method, tout comme dans DAC :
classe statique publique QueryExpressionExtension
{
public static RaisingStudio.Data.Expressions.IQueryExpression<T> Où<T>(
cette source RaisingStudio.Data.Expressions.IQueryExpression<T>,
Expression<Func<T, prédicat RaisingStudio.Data.Expressions.ConditionExpression>>)
{
retour (nouveau RaisingStudio.Data.Expressions.QueryExpression<T>(
source.Valeur,
source.Table,
(predicate.Compile())(source.Value),
source.Colonnes));
}
public statique RaisingStudio.Data.Expressions.IQueryExpression<T> OrderBy<T>(
cette source RaisingStudio.Data.Expressions.IQueryExpression<T>,
Expression<Func<T, prédicat RaisingStudio.Data.Expressions.ColumnExpression>>)
{ … }
public statique RaisingStudio.Data.Expressions.IQueryExpression<T> Select<T>(
cette source RaisingStudio.Data.Expressions.IQueryExpression<T>,
Expression<Func<T, object>> prédicat)
{ ... }
}
Dans l'implémentation de la méthode, appelez la méthode Compile sur l'expression "système" entrante pour renvoyer l'expression "personnalisée", puis enregistrez ces expressions "personnalisées" dans le "QueryExpression" )", lorsque la "requête" est exécutée, l'expression « personnalisée » enregistrée peut être directement extraite de cette façon, la requête peut être implémentée en utilisant l'analyse originale de l'expression « personnalisée » dans le code ci-dessus ! ! !