問題タブ [linqkit]
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.
c# - LinqKit System.InvalidCastException メンバー プロパティでメソッド提供の式を呼び出すとき
単純な親子クラス構造が与えられます。linqkit を使用して、親に子ラムダ式を適用したいと考えています。また、ユーティリティ メソッドによって Lambda 式が提供されるようにしたいと考えています。
上記のコードはスローします
c# - LinqKitのエキスパンダーがフィールドから式を取得できない特別な理由はありますか?
その場で式を組み合わせることができるLinqKitライブラリを使用しています 。
これは、エンティティFramewokデータアクセスレイヤーを作成するための純粋な至福です。複数の式をオプションで再利用および結合できるため、読み取り可能で効率的なコードの両方が可能になります。
次のコードを検討してください。
Message
投影する式を宣言しますMessageView
(わかりやすくするために詳細を削除しました)。
これで、データアクセスコードはこの式を使用して個々のメッセージを取得できます。
まったく同じ式をメッセージリストの取得にも再利用できるため、これはすばらしいことです。
ご覧のとおり、射影式はに格納され_selectMessageViewExpr
、いくつかの異なるクエリを作成するために使用されます。
ただし、このコードがExpand()
呼び出し時にクラッシュするという奇妙なエラーの追跡に多くの時間を費やしました。
エラーは言った:
System.Linq.Expressions.FieldExpression
タイプのオブジェクトをタイプにキャストできませんSystem.Linq.Expressions.LambdaExpression
。
式が呼び出される前にローカル変数で参照されると、すべてが機能するInvoke
ことに気付いたのはしばらくしてからです。
このコードは期待どおりに機能します。
私の質問は:
Invoke
LinqKitがフィールドに格納された式を認識しない特定の理由はありますか?それは開発者による単なる省略ですか、それとも式を最初にローカル変数に格納する必要がある重要な理由がありますか?
この質問は、生成されたコードを調べてLinqKitソースを確認することでおそらく答えることができますが、LinqKit開発に関係する誰かがこの質問に答えることができるのではないかと思いました。
ありがとう。
entity-framework-4 - PredicateBuilder を使用して単語の一部を一致させる
LinqKit述語ビルダーを使用してレコードを見つけています。%word% と同じように一致させる必要があります
p -> は、FirstName、LastName などの顧客クラスです....
しかし、私が使用するとき:
完全一致のみを取得します。コードを変更して部分一致を取得するにはどうすればよいですか (dani を探す場合、「dani」と「daniel」の両方を取得したい)
ありがとう。
linq - Entity Framework: 混合エンティティの混合述語
私のひどい英語でごめんなさい。
EF モデルを拡張しようとしています (LinqKit を使用)。
単一エンティティ式を使用する限り問題はありませんが、混合式を使用する場合は、単に行き詰まります。
たとえば、そのような一種の投稿クラス...
...HasMetas 式でエンティティ「vit_post」を拡張します。
このスニペットを使用すると、予想どおり、エンティティのサブセットを取得できます。
しかし、この式を「vit_postmeta」エンティティに移動しようとすると、次のようになります。
私の考えは、元のメソッドを vit_post に保持し、次のように変更することでした:
しかし、「「vit_postmeta」には「HasMetas」の定義が含まれておらず、タイプ「vit_postmeta」の最初の引数を受け入れる拡張メソッド「HasMetas」が見つからないため、それはできません。
何かが足りないのはわかっていますが、何が見つかりません。
アップデート
それぞれのエンティティ部分クラスですべての式を実装する代替ソリューション (そしておそらく適切なソリューションも) を見つけました。たとえば、vit_post には vit_posts のテーブルに関連するすべての式があり、vit_postmeta には vit_postmeta のテーブルに関連するすべての式があります。
私の Search クラスには、各エンティティのプライベート メソッドがあります。何かのようなもの:
次に、GetResults() 関数がこれらすべてのメソッドを呼び出して結合します。
この方法でクエリを機能させることができますが、これが正しい方法であるかどうかはまだわかりません。
c# - 式の使用方法> LinqからEFへの条件はどこですか?
このトピックについてはすでにいくつかの質問がありますが(たとえば、Expression.Invoke in Entity Framework?)、特定の状況に対する答えを見つけることができませんでした。次のようなメソッドを定義したいと思います。
AsExpandableメソッドはLinqKitからのものです(前述のスレッドでアドバイスされたように)。ただし、彼のようにメソッドを呼び出そうとすると、次のようになります。
それはInvalidCastExceptionをスローします:
タイプ'System.Linq.Expressions.InstanceMethodCallExpressionN'のオブジェクトをタイプ'System.Linq.Expressions.LambdaExpression'にキャストできません。私は何が間違っているのですか?
linq - IQueryableGenerics&Interfacesを使用したEntityObjectで(可能?)
次の検索機能を備えたLinqKitを使用したEntityFramework4.0の検索リポジトリがあります。
また、IQueryableの戻り値を使用して、ブール値のLinqKitPredicateBuilder式では不可能な方法でクエリをサブセット化する別のクラス:
ここでの問題は、EntityObjectとしての「T」がGUIDを定義していないため、これを使用できないことです。これに対する自然な応答は、GUIDプロパティで制約を使用するようにSubsetByUser()メソッドを実際に定義することです。
しかし、これは機能しません。LinqKitを使用していますが、Expandable()メソッドの結果は次のようになります。
IQueryableを返す必要があります。私はこのような偽物をすることができます:
もちろん、これは機能しますが、もちろん、これは非常にクレイジーなことでもあります。(IQueryableが必要な理由は、最終的になるまでクエリを実行しないためです。
私もこれを試しました:
これは、リフレクションを使用してRunsコレクションを取得し、コンパイラエラーを回避します。それはかなり賢いと思いましたが、LINQ例外が発生します。
検索方法を変更することもできます。
ただし、IRunElementはEntityObjectではなく、ObjectSetはTをクラスとして制約するため、これはもちろんコンパイルされません。
最後の可能性は、単にすべてのパラメーターと戻り値をIEnumerableにすることです。
これも機能しますが、これもインスタンス化を最後まで遅らせることはできません。
したがって、すべてをIEnumerableとしてインスタンス化し、AsQueryable()を使用して返すことなく、この作業を行うためにできることはほとんどないようです。私が欠けているこれをまとめることができる方法はありますか?
predicatebuilder - PredicateBuilder And または Or
述語ビルダーについて私が見たすべての例ではPredicateBuilder.True
、「and」式基準をPredicateBuilder.False
構築している場合と「or」式基準を構築している場合の開始式を示しています。
私の質問は、これは常に当てはまるのか、もしそうなら、なぜこれを単純に推測できないのかということです。「and」式を作成していて、false から始めたい場合があると思います。そして「または」の反対
誰かが私にこれを説明できますか?
linq - LinqKit とサブクエリのフィルター処理
1 対多の関係 (EF) があり、1 の関係をフィルター処理し、多の関係をフィルター処理するクエリを作成したいと考えています。
例:会社には多くの従業員がいます
Company.Name = "ZonSoft" でフィルタリングし、Company.Employees に "Hesius" という名前の従業員が少なくとも 1 人いるクエリを作成します。
これは問題なく動作しますが、コンパイル時にフィルターが不明な場合はどうなるでしょうか? ユーザーは多くのフィルター (名前、年齢など) から選択できますが、そのためのコードをあまり書きたくありません。
Expression と linqkit を試していますが、Employees リレーションでフィルターを機能させることができません。
'
これら 2 つのフィルターを 1 つのクエリで組み合わせるにはどうすればよいですか? または、希望する結果を得るにはどうすればよいですか?
これは機能します: '
私はこのようなものを探しています:
entity-framework-4 - LINQtoEntitiesおよびLinqKit/PredicateBuilderを使用してリファクタリングできません
LINQ式をメソッドにリファクタリングしようとしていて、" Internal .NET Framework Data Provider error 1025.
"と""の両方のThe parameter 'xyz' was not bound in the specified LINQ to Entities query expression.
例外が発生しています。
エンティティモデルの関連部分は次のとおりです(EF 4.2 / LINQ to Entitiesを使用)。
基本的なリレーショナルモデルは次のとおりです。
検索が行われると、 ORで始まるエンティティ、または検索で始まるエンティティを検索するクエリを作成しようとしてterm
います。(これはクエリの一部ですが、sはにのみ一致する必要があるため、問題が発生している場所ではありません。)Place
OfficialName
term
PlaceName
Text
AsciiEquivalent
term
Language
PlaceName
CultureInfo.CurrentUICulture.TwoLetterIsoLanguageName
次のコードは機能します:
次にやろうとしているのは、メソッドをリファクタリングしNonOfficialNameMatches
て式を別のメソッドに抽出し、name => ...
他のクエリで再利用できるようにすることです。これが私が試した1つの例ですが、これは機能せず、例外 ""をスローしますThe parameter 'place' was not bound in the specified LINQ to Entities query expression.
:
.AsExpandable()
チェーンがない場合NonOfficialNameMatches
、" Internal .NET Framework Data Provider error 1025.
"例外が発生します。
ここでは、述語の呼び出しのいくつかの組み合わせなど、他のアドバイスに従い.Expand()
ましたが、常に前述の例外の1つになります。
LINQ to Entities with LinqKit / PredicateBuilderを使用して、この式を別のメソッドに分解することも可能ですか?もしそうなら、どのように?私は何が間違っているのですか?
c# - 式メソッドでlinqkitの述語を使用するとエラーが発生する
ちょっとした背景:
特定の操作をサポートしていない
Linq プロバイダー ( MsCrm2011 Linq provider ですが、実際には問題ではありません) を使用しています。
具体的には、式の中ではサポートされていませんContains()
。
意味 - 次のようなものは機能しません: var users = DataContext.Users.Where(user => userIds.Contains(user.Id))
.
私が見つけた解決策は、 LinqKitの述語を使用することだったので、代わりuserIds.Contains(...)
にuser.Id == userIds[0] || user.Id == userIds[1] ... || user.Id == userIds[100]
.
この目的のために、任意のコレクションと任意の式を取り、それらに「Or」を適用する次の関数を定義しました。
このように、あらゆる種類のコレクションとあらゆる種類の表現を使用できます。
たとえば、次のテスト ランを参照してください (メモリ内のユーザー コレクションを使用):var res = FilterByCollection(users.AsQueryable(), rolesList, (account, role) => account.Role == role)
特定のロールのいずれかを持つすべてのユーザーを検索します。
ただし、上記の例を実行すると、次の例外が発生しますvariable 'entity' of type 'User' referenced from scope '', but it is not defined
。
何か案は?
PSはこれがどれほど関連性があるかわかりませんが、メモリ内コレクションの代わりにCrmデータコンテキストを実際に使用している場合、このエラーは発生しません. :/