string id = (from c in context.Users
where c.u_id == Id
select c.u_id).SingleOrDefault();
1)上記のLinq準拠クエリを使用して、上記のパフォーマンスを向上させる方法。.NET3.5のみの使用に制限されています。
2)上記のコードに対してコンパイルされたlinqクエリを使用すると、パーセンテージでパフォーマンスがどのように向上しますか?
string id = (from c in context.Users
where c.u_id == Id
select c.u_id).SingleOrDefault();
1)上記のLinq準拠クエリを使用して、上記のパフォーマンスを向上させる方法。.NET3.5のみの使用に制限されています。
2)上記のコードに対してコンパイルされたlinqクエリを使用すると、パーセンテージでパフォーマンスがどのように向上しますか?
コンパイルされたクエリは、次の方法で作成します。
Func<YourContextType, int, string> query = CompiledQuery.Compile(
(YourContextType context, int id) =>
context.Users.Where(u => u.u_id == id).Select(u => u.u_id)
.SingleOrDefault()
);
次に、これを次のように使用します。
string resultId = query(context, Id);
パフォーマンスの向上に関しては、これは重要かもしれませんが、最小限の場合もあります。これは、クエリの実行速度と、コンパイルされたクエリを再利用できる頻度によって異なります。多くの場合、コンパイルのオーバーヘッドが速度の向上を補わないため、cmopiledクエリの使用は実際には遅くなります。これが努力の価値があるかどうかを判断するために測定する必要があります。
一意のIDが1つしかないことがわかっている場合は、FirstOrDefault()
の代わりにを使用するだけで、元のクエリを高速化できる可能性があることに注意してくださいSingleOrDefault()
。
コンパイルされたクエリを次のように宣言します。
static readonly Func<ENTITIES, YOUR_ID_TYPE, RETURN_VALUE_TYPE> compiledQuery =
CompiledQuery.Compile<ENTITIES, YOUR_ID_TYPE, RETURN_VALUE_TYPE>(
(ctx, Id) => (from c in ctx.Users
where c.u_id == Id
select c.u_id).SingleOrDefault();
次に、コードでコンパイル済みクエリを呼び出します。
RETURN_VALUE_TYPE results = compiledQuery.Invoke(context, Id);
また、いくつかのことに依存する可能性のあるパフォーマンスの向上に関しては、LINQクエリ実行の範囲では、クエリのコンパイルはプロセスのコストのかかる部分であることに注意してください。LINQクエリロジックをLINQtoSQLまたはEntityFrameworkベースのアプリケーションに追加するときはいつでも、クエリを事前にコンパイルして再利用することを検討する必要があります。
生意気なオプションは次のようになります。このような些細な、しかしパフォーマンスが重要な操作にLINQを使用しないでください。たとえば、dapper-dot-netの場合:
string id = connection.Query<string>(
@"select u_id from Users where u_id = @id",
new { id = Id }).SingleOrDefault();
これにより、すべてのLINQ抽象化が完全に回避され、データベースに直接依存します(完全にパラメーターなしなど)。