わかりました、やります。広告を投稿するつもりだったのですが、純粋に広告を投稿すると、きっとたくさんの呪いとレンガと卵があちこちに飛び交うだろうと思いました。カスタム LINQ について、式をサポートするコードについて説明します。おそらく、独自のデータ層を作成する人や、実用的な LINQ 拡張機能を作成したい人には役立つでしょう。 「提案」としていただければ幸いです!
DAC の以前のバージョンでは、クエリに次の式が使用されていました。
IEnumerable<問題> q = this.dc.Query<問題>(Issue._.IssueID >= 0);
この「かわいい」「_」はとても「未熟」に見えますし、特にLINQが猛威を振るうこの時代においては、非常に「時代の進歩」を感じます。したがって、DAC 拡張 LINQ をサポートする v2.6 バージョンがあります。
var q = this.dc.Query<Issue>(s => s.IssueID > 0);
または
var q = from s in (this.dc.GetQueryableData<Issue>())
ここで、s.IssueID > 0
を選択します。
上記の 2 つのメソッドの実装は、主に式の解析と SQL ステートメントのアセンブルに依存します。 Lao Zhao の投稿は非常によく書かれており、DAC のソース コードも見ることができます (広告を挿入しています)。
今日私が主に言いたいのは、もともと独自の式ツリーとその解析関数を持っている場合、それを LINQ をサポートするように簡単に「アップグレード」できるかということです。 !はい、簡単です!
var q = SystemUser._ の s から
ここで、s.FullName == s.FullName.Max
orderby s.UserID
s.Except(s.Password) を選択します。
オブジェクトを「where」、「orderby」、「select」にできるようにするには、「Where」、「OrderBy」、「Select」という名前のメソッドを実装するか、DAC と同様に Extension Method メソッドを使用します。
パブリック静的クラス QueryExpressionExtension
{
public static RaisingStudio.Data.Expressions.IQueryExpression<T> Where<T>(
この RaisingStudio.Data.Expressions.IQueryExpression<T> ソース、
Expression<Func<T, RaisingStudio.Data.Expressions.ConditionExpression>> 述語)
{
return (new RaisingStudio.Data.Expressions.QueryExpression<T>(
ソース.値、
ソース.テーブル、
(predicate.Compile())(source.Value)、
ソース.列));
}
public static RaisingStudio.Data.Expressions.IQueryExpression<T> OrderBy<T>(
この RaisingStudio.Data.Expressions.IQueryExpression<T> ソース、
Expression<Func<T, RaisingStudio.Data.Expressions.ColumnExpression>> 述語)
{ … }
public static RaisingStudio.Data.Expressions.IQueryExpression<T> Select<T>(
この RaisingStudio.Data.Expressions.IQueryExpression<T> ソース、
Expression<Func<T, object>> 述語)
{ ... }
}
メソッドの実装では、受信した「システム」式で Compile メソッドを呼び出して「カスタム」式を返し、「クエリ」の実行時にこれらの「カスタム」式を「QueryExpression」に保存します。保存された「カスタム」式は、上記のコードの「カスタム」式の元の解析を使用して直接取り出すことができます。 ! !