ODAC(Oracle Data Access Components)、Entity Framework 4.3.1、および式ツリーに問題があります。Entity Frameworkでマッピングしているレガシーデータベースがあります(全員ではありませんか?)。このテーブルには、数百万のレコードと100を超える列(悲しい顔)があります。
インデックス付きの列に対するクエリの例を次に示します。
int myId = 2;
var matchingRecord = context.MyLargeTable.Where(v=>v.Id == myId).ToList(); //Super slow (5+ minutes, sometimes Out of Memory exception)
int myId = 2;
Expression<Func<bool>> myLambda = v => v.Id == myId; //Shouldn't this work now?
var matchingRecord = context.MyLargeTable.Where(myLambda).ToList(); //Still super slow (5+ minutes, sometimes Out of Memory exception)
var elementName = Expression.Parameter(typeof(LargeTable), "v");
var propertyName = Expression.Parameter(elementName, "Id");
var constantValue = Expression.Constant(myId);
var comparisonMethod = Expression.Call(
propertyName,
typeof(int).GetMethod("Equals", new[] { typeof(int) }),
constantValue
)
var finalTree = Expression.Lambda<Func<LargeTable, bool>>(comparisonMethod, elementName);
var matchingRecord = context.MyLargeTable.Where(finalTree).ToList(); //Super fast
Func <>とExpression>の違いと、Expression>が実際にクエリのためにデータベースに渡される方法を説明するこのようなものを読みました。そのため、より高速です。
http://www.fascinatedwithsoftware.com/blog/post/2011/12/02/Falling-in-Love-with-LINQ-Part-7-Expressions-and-Funcs.aspx-全体は良いですが、急いで、主なポイントについては「意図しない結果」というタイトルのセクションを読んでください
Func<T>ではなくExpression<Func<T >>を使用するのはなぜですか?-対応するSOの質問がなければ、リンクのセットは完成しません。
私の質問はこれです:人々は本当にそこに座ってExpression。*クラスを使用して式ツリーを構築していますか?単純な比較以外のクエリは非常に複雑になり、読むことはほとんど不可能です。式>をデータベースに渡すことについて何が欠けていますか?この手動で構築された式ツリーソリューションの顔を殴るのは誰ですか?オラクル?EF?私は何が欠けていますか?