問題タブ [linq-expressions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linq - LINQ to SQL 式をテストする
LINQ to SQL を介して MS SQL データベースで動作するアプリケーションを作成しています。フィルタリングを実行する必要がある場合や、フィルタリング条件が複雑すぎて SQL クエリに変換できない場合があります。それらを翻訳可能にしようとしていますが、アプリケーションが少なくとも動作することを望んでいますが、遅くなることもあります。
LINQ to SQL データ モデルはリポジトリ内に隠されているため、さまざまなケースに対して複数の GetAll メソッド オーバーロードを提供したり、上位レベルで使用するオーバーロードを認識したりしたくありません。したがって、リポジトリ内の式が翻訳可能であることをテストし、そうでない場合は、クエリのインスタンス化で NotSupportedException をスローする代わりに、データセット全体に対してメモリ内クエリを実行したいと考えています。
これは私が今持っているものです:
searchExpression
はExpression<Func<TEntity, bool>>
ご覧のとおりFirstOrDefault
、クエリをインスタンス化して、インスタンス化できない場合は例外をスローしようとしています。ただし、式が適切な場合は、無駄なデータベース呼び出しを実行します。Any
、または他の方法を使用することもできます。Count
それは よりも少し安価かもしれませんFirstOrDefault
が、それでも頭に浮かぶすべての方法はデータベースへのコストのかかる旅をしますが、必要なのは式をテストすることだけです。
実際のデータベース呼び出しなしで、私の式が「良い」か「悪い」かを判断する別の方法はありますか?
アップデート:
または、より一般的に言えば、LINQ が SQL の構築に失敗したときにインメモリ クエリを作成するように指示して、このテスト メカニズムがまったく必要ないようにする方法はありますか?
c# - この linq 式の作成の何が問題になっていますか (contains を使用)
contains 演算子を使用して linq 式を動的に作成しようとしています。
このトピックに関連するいくつかの投稿を読んだ後、「contains」のような評価を実行できる次のコードを思いつきました。
そして、これは次のように呼び出されます。
ただし、実行時に次のようなエラーが発生します。
型 'System.Func`2[DAL.BestAvailableFIP,System.Boolean]' の式は、戻り型 'System.Boolean' には使用できません
ここで、「DAL.BestAvailableFIP」は「TEntity」タイプです。
これはすべて、ラムダ式に関する知識の欠如に関連していると確信しています。誰が私が間違っているのか教えてもらえますか?
.net - .NET で単純な式ツリーを構築する
ユーザーがいくつかの要素とそれらの間の演算子を示すインターフェイスがあり、結果を表示する必要があります。
ユーザーは、p1 OP v1 OR p2 OP v2
wherep1
のようなフィルターを作成して、 etc のようp2
なPerson
プロパティを作成し、比較値 (10、'Maria'、'LA')、OP は比較演算子 (=、<、>)、OR は論理演算子 (can) です。 AND にもなります)。Age, Name, Location
v1
v2
例:
Age > 18 AND Location = 'Paris'
、または別のようなもの
Name Contains 'andro' AND Sex = 'm'
myPeople
コレクションとこのフィルター文字列があれば、Linq.Expressions を使用してこの式を作成して適用するにはどうすればよいですか?
DynamicLinqを使用しようとしましたが、実際には "Where" on の使用に問題がありList<Person>
、明らかにそうではありませんIQueryable
...
c# - LINQを使用した動的式。キッチンを見つける方法は?
ユーザー動的フィルターを実装してみます。使用すると、いくつかのプロパティが選択され、いくつかの演算子が選択され、値も選択されます。
この質問に対する答えがまだ見つからなかったので、LINQ式を使用しようとしました。
主に、メインルームがキッチンであるすべての家を特定する必要があります(あらゆる感覚、私は知っています)。
c# - String.IndexOfメソッドの式ツリー
の式ツリーをどのように構築する必要がありstring.IndexOf("substring", StringComparison.OrdinalIgnoreCase)
ますか?
2番目の引数なしで動作させることができます:StringComparison.OrdinalIgnoreCase
。これまでの私の試みは次のとおりです。
またこれを試しました:
パラメータを無視すると動作するようになることを覚えておいてくださいOrdinalIgnoreCase
。
ありがとう
c# - Linq-Expression.AndN要素を結合するBinayExpression
BinaryExpressionのリストがあり、このリストの要素を1つの「オブジェクト」に結合する必要があります。
私のリストの中に私はこれを持っています:
私はこのようなものが必要です:
LinqにはExpressionがあることを知っています。そして、これを実装するためのロジックを作成する必要がありますが、できませんでした。リスト内でExpressionをループしようとしましたが、Expressionが2つ必要で、ループ内には1つしかありません。この後、次のように、この単一の「オブジェクト」からExpression.Lambaを作成します。
nhibernate - NHibernate+DDDコンテキストでのLinq式の書き直し
Linq式の変換について厄介な質問があります。よく調べてみましたが、この件をカバーしていると思われるものは見つかりませんでした。少なくともラムダの作成とメソッドへの受け渡しに関しては、Linqにかなり精通していますが、Expressionに関するものはやや弱いです。
まず、いくつかのコンテキスト:私は多くのDDD風のプロジェクトで使用されているNHibernateに基づく一般的な永続化ソリューションを持っています。アグリゲート内の特定の子のコレクションが本質的に無限である(つまり、実際には非常に大きい)可能性がある特殊なケースでは、コレクション全体をメモリにロードすることは決して受け入れられないため、セットまたはバッグを単純にマップすることはできません。このアーキテクチャでは、APIを使用するコードがリポジトリと直接通信してクエリを実行したり、その方法で結果を制限したりすることはできません。もちろん、APIにコレクションをまったく持たず、代わりに子オブジェクトの関連するサブセットを取得するメソッドを公開することはできません(これが機能しない場合は、これを実行します)が、少し異なることをしようとしています。そして、私はほとんどそれを機能させています...
これらのプロジェクトはFluent(自動マッピングではない)でマッピングされているため、フォームでベースマップクラスにメソッドを追加しました
PropertyInfo
このメソッドは、最初のメソッドExpression
(マップするメンバーを指定する)から関連性を導き出します。セレクターExpression
には、通常のNHibernateマッピングの代わりに、親オブジェクトと子オブジェクトの間の関係が含まれています。
User
したがって、ドメインタイプ(T
上記)のセレクターがマップにあるとします。
これは、指定されたuTransactions
であるすべてのサブセットと、であるプロパティの間のマッピングを指定します。実際のオブジェクトを作成するとき、これを次のように変換する必要がありますTransaction.User
User
User.Transactions
IQueryable<Transaction>
User
構築されているオブジェクトthis
はどこにありますか。つまり、にマップする方法を示す一般的なルールを使用して、これをにマップするためのルールに変換しUser
たいと思います。次に、この式を使用して、Linqクエリを実行することにより、リポジトリからを生成できます。Users
Transactions
User
Transactions
IQueryable<Transaction>
これは、セレクターがである場合にのみ機能しますFunc<Transaction, bool>
。したがって、私の最終的な必要性は、元の式を変換することです。これにより、が生成さFunc<User, Transaction, bool>
れFunc<Transaction, bool>
ます。
これによりIQueryable
、すべてのクエリ操作がLinqからNHibernateクエリとして実行されるコレクションが得られるため、コレクション全体がメモリに読み込まれることはありません(はい、実際にそれを実行するクエリをフレーム化できることはわかっていますが、コードレビュー時にそれらをキャッチできます)。
ふぅ。それが理にかなっていることを願っています。
私を正しい方向に向けることができるリートエクスプレッションの書き直しスキルを持っている人はいますか?
entity-framework-4.1 - 複数の Include ステートメントをリポジトリに渡しますか?
特定のエンティティを含めることができるように、include ステートメントのコレクションをリポジトリに渡す方法を見つけようとしています。以下は私のリポジトリからのサンプルコードです。
GetByID メソッドは、GetSet を呼び出してエンティティ セットを返します。GetById の一部として (式を介して) エンティティのコレクションを渡すことができれば、GetSet をサービスに公開する必要がなくなると考えていました。したがって、次のようなものです。
var entity = _repository.GetById(theId, e => {e.Prop1, e.Prop2, e.Prop3});
次に、その式を GetSet メソッドに渡し、それを include ステートメントに渡すことができます。考え?
linq - nHibernate linq プロバイダー拡張機能の式のヘルプ
BaseHqlGeneratorForMethod を拡張することにより、nHibernate のカスタム linq 拡張に取り組んでいます。テクニックはここに文書化されています: http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-extension.html
さまざまな種類の操作でこれらを実装することに成功しましたが、単純な linq 式を完全な式ツリーに変換するのは簡単ではありません。私は今、1つにこだわっています。
この例では、3 つのエンティティがあります。 Employee
、Group
、およびEmployeeGroup
。EmployeeGroup クラスは、Employee と Group の間に多対多の関係を設定します。各従業員が各グループで持つ特定のアクセス許可など、追跡する追加のプロパティがあるため、特に中間クラスを作成する必要があります。したがって、nHibernate の多対多の関係ではなく、2 つの 1 対多の関係があります。
ここで、特定の従業員を含むすべてのグループを取得したいとします。このクエリを書くことができます:
これは問題なく機能しますが、入力するのは大変です。私はむしろこれを行うことができます:
次のような拡張メソッドを作成することから始めます。
これは、グループのローカル リストをクエリするときに機能しますが、nHibernate セッションに対しては機能しません。そのためには、linq 拡張機能も作成して登録する必要があります。記事 (上記のリンク) と同じように、GroupHasEmployeeGenerator
を拡張するクラスを作成しますBaseHqlGeneratorForMethod
。.SupportedMethods
HasEmployee 拡張メソッドを参照するようにそのプロパティを設定しました。
私が迷子になるのは、へのオーバーライドBuildHql
です。構築する式はすぐに複雑になります。私は.Any
句を置き換えているので、組み込みクラスのソースから始めるのが良いでしょうAnyHqlGenerator
。ただし、ソースが元の要素のプロパティであることは考慮されていません。また、where 句を表すラムダ式がないことも考慮されていません。これらのパーツを手動で作成する必要があります。
これまでのところ、私の試みを投稿しても意味がありません.
この単純な式をメソッドのオーバーライドに適した一連のメソッドに変換するのを誰か手伝ってくれませんBuildHql
か?
これに関するより良いドキュメントがあれば、私に知らせてください。ありがとう。