2
string id = (from c in context.Users
             where c.u_id == Id
             select c.u_id).SingleOrDefault();

1)上記のLinq準拠クエリを使用して、上記のパフォーマンスを向上させる方法。.NET3.5のみの使用に制限されています。

2)上記のコードに対してコンパイルされたlinqクエリを使用すると、パーセンテージでパフォーマンスがどのように向上しますか?

4

3 に答える 3

3

コンパイルされたクエリは、次の方法で作成します。

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()

于 2012-08-29T17:06:26.580 に答える
1

コンパイルされたクエリを次のように宣言します。

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ベースのアプリケーションに追加するときはいつでも、クエリを事前にコンパイルして再利用することを検討する必要があります。

于 2012-08-29T17:05:51.950 に答える
1

生意気なオプションは次のようになります。このような些細な、しかしパフォーマンスが重要な操作にLINQを使用しないでください。たとえば、dapper-dot-netの場合:

string id = connection.Query<string>(
    @"select u_id from Users where u_id = @id",
    new { id = Id }).SingleOrDefault();

これにより、すべてのLINQ抽象化が完全に回避され、データベースに直接依存します(完全にパラメーターなしなど)。

于 2012-08-29T17:20:24.583 に答える