Linq技术四:动态Linq技术--Linq.Expressions
前面介绍了Linq的三个方面应用:Linq to SQL, Linq to XML和Linq to Object,这篇介绍一下动态Linq的实现方式及应用场景。 命名空间: System.Linq; System.Linq.Expressions; 应用Linq的时候,我们都知道只需要Lambda表达式就行,但有些场景仅仅只使用Data
前面介绍了Linq的三个方面应用:Linq to SQL, Linq to XML和Linq to Object,这篇介绍一下动态Linq的实现方式及应用场景。
命名空间:
System.Linq;
System.Linq.Expressions;
应用Linq的时候,我们都知道只需要Lambda表达式就行,但有些场景仅仅只使用Data Model的字段名操作是不够的或者不方便的。
场景1:假设我们需要拼接Where条件进行查询,一种方式可以拼接IQueryable的表达式。但我想像写SQL语句那样直接拼接一个Where条件就行,Linq要怎么实现?
场景2:假设我们想要一个列表,这个列表可以按每个表头来排序,我们把表头当作参数传给排序函数,在函数内部该怎么实现呢?可以逐一枚举对比,针对不同的列写不同的Linq语句,但代码很冗余。用传统方式根据动态字段名怎么实现?
下面来说说Linq的另一种应用方式: 动态Linq,使用Linq.Expressions. 场景1, 我只想用Where拼接(表名参数)就完成操作,下面看看实现。下面所有的Demo只是应用于Linq to SQL, 如果是Entity Framework会有差异.
DataClasses1DataContext dbContext = new DataClasses1DataContext();
public string dynamicLinq(int id = 50)
{
IQueryable
ParameterExpression paraExpr = Expression.Parameter(typeof(DataListForDemo), "data");
MemberExpression propExpr = Expression.Property(paraExpr, typeof(DataListForDemo).GetProperty("ID"));
BinaryExpression filter = Expression.LessThan(propExpr, Expression.Constant(id));
LambdaExpression lambdaWhere = Expression.Lambda(filter, paraExpr);
MethodCallExpression Where = Expression.Call(typeof(Queryable),
"Where",
new Type[] { typeof(DataListForDemo) },
Expression.Constant(dLinq),
lambdaWhere
);
var data0 = dLinq.AsQueryable().Provider.CreateQuery(Where);
DbCommand comm = dbContext.GetCommand(data0);
dbContext.Log(comm.CommandText);
return comm.CommandText;
}
上面是各种Linq.Expression的类, 用ParameterExpression定义参数也就是要操作的实体对象, 用PropertyExpression定义属性也就是要操作的字段, 用BinaryExpression定义条件查询的表达式也就是Where条件, 用LambdaExpression定义Lambda表达式也就是IQueryable对象, 最后一步就是来完成调用. Call方法是来定义你的表达式方法, 如: Where, Select, OrderBy, GroupBy, All, Any, Equal等等方法, 有哪一种动态需求就写哪一种方法, 这个在MSDN上面没有太多实例, 不过网上可以查到很多.
上面返回的是生成的SQL语句, SQL语句是这样的:
SELECT [t0].[ID], [t0].[col1], [t0].[col2], [t0].[col3], [t0].[col5], [t0].[col4]
FROM [dbo].[DataListForDemo] AS [t0]
WHERE [t0].[ID]
对照生成的SQL语句和Expression的表达式就很容易理解Linq是怎么实现的和怎么工作的. 那么有些人会问, IQueayable和IEnuerable的对象都会带有Linq的表达式而并不是单独的方法通过传参数实现, 要实现这种方式那么就得提一下什么是扩展方法以及扩展方法怎么实现. 在C#里面要扩展某个对象的方法可以override基类方法, 但是像string, iqueryable等这种对象怎么扩展它们的方法呢? Override基类当然不行, 这时就要用this关键字,也是this的另一种应用方式.
使用扩展方法, 首先写一个静态类, 在静态类里面定义一个静态方法, 静态方法里面第一个参数以this开始, 第一个参数也就是你要扩展的系统对象.
如:
public static class DynamicQueryable
{
//扩展IQueryable对象的方法
public static IQueryable Where(this IQueryable source, string predicate, params object[] values)
{
if (source == null) throw new ArgumentNullException("source");
if (predicate == null) throw new ArgumentNullException("predicate");
LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, typeof(bool), predicate, values);
return source.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Where",
new Type[] { source.ElementType },
source.Expression, Expression.Quote(lambda)));
}
public static LambdaExpression ParseLambda(Type itType, Type resultType, string expression, params object[] values)
{
return ParseLambda(new ParameterExpression[] { Expression.Parameter(itType, "") }, resultType, expression, values);
}
}
上面就是扩展IQueryabler方法, 所以IQueryable类型的所有对象都有了动态Where的功能, 我不知道为什么Microsoft团队没有把这个功能加上, 而只是提供了Expressions类, 加上这些动态表达之后Linq功能会非常强壮.
来看看调用:
public string SelectDynamic(int id = 0)
{
DataListForDemo model = dbContext.DataListForDemos.Where("ID = " + id.ToString()).SingleOrDefault();
return model.ID.ToString();
}
现在很明显的一个变化是Where里面可以只写一个拼接的where条件了, 而且是一个字符串, 这就是大多数程序员想到的东东吧!
Linq里面所有已经存在的方法都可以通过这种方式扩展和实现动态化, 更多的实现方式可以Google, 建议使用Google, 英文文章有的写得非常透彻,而且资源丰富.

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









仮想マシンを作成するときに、ディスクの種類を選択するように求められます。固定ディスクまたはダイナミック ディスクを選択できます。固定ディスクを選択した後でダイナミック ディスクが必要であることに気付いた場合、またはその逆の場合はどうすればよいでしょうか? いいですね!一方をもう一方に変換できます。この記事では、VirtualBox 固定ディスクをダイナミック ディスクに、またはその逆に変換する方法を説明します。ダイナミック ディスクは、最初は小さいサイズですが、仮想マシンにデータを保存するにつれてサイズが大きくなる仮想ハード ディスクです。ダイナミック ディスクは、必要なだけのホスト ストレージ スペースのみを使用するため、ストレージ スペースを節約するのに非常に効率的です。ただし、ディスク容量が増加すると、コンピュータのパフォーマンスがわずかに影響を受ける可能性があります。仮想マシンでは固定ディスクとダイナミック ディスクが一般的に使用されます

StableDiffusion3 の論文がついに登場しました!このモデルは2週間前にリリースされ、Soraと同じDiT(DiffusionTransformer)アーキテクチャを採用しており、リリースされると大きな話題を呼びました。前バージョンと比較して、StableDiffusion3で生成される画像の品質が大幅に向上し、マルチテーマプロンプトに対応したほか、テキスト書き込み効果も向上し、文字化けが発生しなくなりました。 StabilityAI は、StableDiffusion3 はパラメータ サイズが 800M から 8B までの一連のモデルであると指摘しました。このパラメーター範囲は、モデルを多くのポータブル デバイス上で直接実行できることを意味し、AI の使用を大幅に削減します。

自動運転では軌道予測が重要な役割を果たしており、自動運転軌道予測とは、車両の走行過程におけるさまざまなデータを分析し、将来の車両の走行軌跡を予測することを指します。自動運転のコアモジュールとして、軌道予測の品質は下流の計画制御にとって非常に重要です。軌道予測タスクには豊富な技術スタックがあり、自動運転の動的/静的知覚、高精度地図、車線境界線、ニューラル ネットワーク アーキテクチャ (CNN&GNN&Transformer) スキルなどに精通している必要があります。始めるのは非常に困難です。多くのファンは、できるだけ早く軌道予測を始めて、落とし穴を避けたいと考えています。今日は、軌道予測に関するよくある問題と入門的な学習方法を取り上げます。関連知識の紹介 1. プレビュー用紙は整っていますか? A: まずアンケートを見てください。

この論文では、自動運転においてさまざまな視野角 (遠近法や鳥瞰図など) から物体を正確に検出するという問題、特に、特徴を遠近法 (PV) 空間から鳥瞰図 (BEV) 空間に効果的に変換する方法について検討します。 Visual Transformation (VT) モジュールを介して実装されます。既存の手法は、2D から 3D への変換と 3D から 2D への変換という 2 つの戦略に大別されます。 2D から 3D への手法は、深さの確率を予測することで高密度の 2D フィーチャを改善しますが、特に遠方の領域では、深さ予測に固有の不確実性により不正確さが生じる可能性があります。 3D から 2D への方法では通常、3D クエリを使用して 2D フィーチャをサンプリングし、Transformer を通じて 3D と 2D フィーチャ間の対応のアテンション ウェイトを学習します。これにより、計算時間と展開時間が増加します。

この四角い男性は、目の前にいる「招かれざる客」の正体について考えながら眉をひそめていることに注意してください。彼女が危険な状況にあることが判明し、これに気づくと、彼女は問題を解決するための戦略を見つけるためにすぐに頭の中で探索を始めました。最終的に、彼女は現場から逃走し、できるだけ早く助けを求め、直ちに行動を起こすことにしました。同時に、反対側の人も彼女と同じことを考えていた……『マインクラフト』では、登場人物全員が人工知能によって制御されている、そんなシーンがありました。それぞれに個性的な設定があり、例えば先ほどの女の子は17歳ながら賢くて勇敢な配達員です。彼らは記憶力と思考力を持ち、Minecraft の舞台となるこの小さな町で人間と同じように暮らしています。彼らを動かすのはまったく新しいものであり、

9 月 23 日、論文「DeepModelFusion:ASurvey」が国立国防技術大学、JD.com、北京理工大学によって発表されました。ディープ モデルの融合/マージは、複数のディープ ラーニング モデルのパラメーターまたは予測を 1 つのモデルに結合する新しいテクノロジーです。さまざまなモデルの機能を組み合わせて、個々のモデルのバイアスとエラーを補償し、パフォーマンスを向上させます。大規模な深層学習モデル (LLM や基本モデルなど) での深層モデルの融合は、高い計算コスト、高次元のパラメーター空間、異なる異種モデル間の干渉など、いくつかの課題に直面しています。この記事では、既存のディープ モデル フュージョン手法を 4 つのカテゴリに分類します。 (1) 「パターン接続」。損失低減パスを介して重み空間内の解を接続し、より適切な初期モデル フュージョンを取得します。

上記と著者の個人的な理解は、画像ベースの 3D 再構成は、一連の入力画像からオブジェクトまたはシーンの 3D 形状を推測することを含む困難なタスクであるということです。学習ベースの手法は、3D形状を直接推定できることから注目を集めています。このレビュー ペーパーは、これまでにない新しいビューの生成など、最先端の 3D 再構成技術に焦点を当てています。入力タイプ、モデル構造、出力表現、トレーニング戦略など、ガウス スプラッシュ メソッドの最近の開発の概要が提供されます。未解決の課題と今後の方向性についても議論します。この分野の急速な進歩と 3D 再構成手法を強化する数多くの機会を考慮すると、アルゴリズムを徹底的に調査することが重要であると思われます。したがって、この研究は、ガウス散乱の最近の進歩の包括的な概要を提供します。 (親指を上にスワイプしてください

ダイナミック SQL は、MyBatis フレームワークの非常に重要な機能の 1 つであり、さまざまな条件に応じて SQL ステートメントを動的に結合および処理し、柔軟な SQL 操作を実現します。このうち、選択タグは動的 SQL の重要なタグであり、主に条件付き選択ロジックを実装するために使用されます。この記事では、MyBatis での選択タグの使用法を調査し、デモンストレーション用の具体的なコード例を示します。 1. 選択タグの基本構文 MyBatis には、選択タグの主な形式が 2 つあります。
