私は奇妙だと思ったLINQ文を作成できました。他の誰かがそれを経験しているかどうかを見たいと思っていました。LINQから同じクエリ内のメソッドにクエリデータを渡す
私はこれにそれを単純化してきました:
var x = db.Test
.Where(a => a.Field1 == Utils.CreateHash(Preferences.getValue(a.Field2)))
.FirstOrDefault();
今どのようにこれは、データベース・コードに変換しますか? LINQは、行のために、すなわち、すべての単一の行のための二重のクエリを実行する必要はありません。
1) Query a.Field2 2) Return value to run Utils.CreateHash(Preferences.getValue(a.Field2)) 3) Take that value from step 2 and compare it against a.Field1 4) Repeat 1-3 until I've gone through all the rows or returned a matching row
これは非常に非効率的ではないでしょうか?または、LINQはこれをより良い方法で実行するのに十分なほどスマートですか?実際にこのコードを実行していないので、別の可能性がランタイムエラーであることに注意してください。なぜLINQは紛争を検出し、それをコンパイルできないほど賢明ではないでしょうか?
あなたのクエリは、あなたが 'Utils 'を呼び出しているのと同じように動作するとは思えません。CreateHash'をDBで実行しようとしています – BrokenGlass
@BrokenGlass私は実際にそれを実行していませんが、なぜそれがコンパイルされますか? Linqは機能がデータベース上にないことを知るのに十分スマートではありませんか? – onit
いいえ、Linq IQuerableプロバイダは実行時に失敗し、ラムダ構文は有効で、プロバイダにはないLinq with Objectsと一緒に実行されます(実行時にクエリをDBクエリに変換します) – BrokenGlass