私は、特定の条件に一致するテーブルの特定の行のデータベースとローカルメモリの両方を調べるためのEF4.1の汎用メソッドを構築しようとしています。LINQ to Entitiesで匿名メソッドを実行するにはどうすればよいですか?
これまでのところ、これは私が持っているものです。
これは発信者です。
dbEntities.MyTables.LocalAndDb(delegate(MyTable s)
{ return s.Description.Contains("test"); });
これは、問題は、この行であるLocalAndDb
public static object LocalAndDb<T>(this DbSet<T> myTable, Func<T, bool> function) where T : class
{
// look in local
var item = myTable.Local.Where(o => function((T)o)).FirstOrDefault()
// if not exist, look in the database
if (item == null)
{
Expression<Func<T, bool>> predicate = (u) => function(u);
item = myTable.Where(predicate).FirstOrDefault();
}
return item;
}
です。
item = myTable.Where(predicate).FirstOrDefault();
データベースを呼び出すと、このエラーがスローされます。
"LINQ表現ノードタイプ 'Invoke'は、LINQ to Entitiesではサポートされていません。
私は匿名メソッドを渡しているため、これをSQLに変換する方法がわからないためです。私はそれをExpressionオブジェクトに変換することはそのトリックを行うと思ったが、まだそれは私のために働いていない。
匿名メソッドをLINQでSQLに変換できるようにするには、何が必要ですか?当然の
public static object LocalAndDb<T>(this DbSet<T> myTable,
Expression<Func<T, bool>> expr) where T : class {
// ...
if (item == null) {
item = myTable.Where(expr).FirstOrDefault();
}
return item;
}
次に、:
コンパイル済み!ありがとう、ありがとう!私はEFに関しては完全な初心者です。しかし、私は今、パフォーマンスの面でいくつかの研究を行います。これは、メソッド内、シグネチャ内、またはプリコンパイルされたコンストラクタ内のいずれであっても、式を「コンパイル」するとパフォーマンスに影響すると言いますか? – Diskdrive
@stickman - 'Precompiled'クラスのアイデアは、一度だけ(' Compile'を一度呼び出すように)簡単に構築し、その結果を 'LocalAndDb'を複数回呼び出す際に繰り返し使用することで、式isn '呼び出しごとに再コンパイルされます。 –
それはきれいです。再度、感謝します! – Diskdrive