0

本当にシンプルであるべきだと思うことをしたいのですが、本当に頭痛の種であることがわかりました。Select新しいオブジェクトを作成する代わりに、投影しているIQueryableオブジェクトを「微調整」したいと思います。これが私ができるようにしたいことです(contextDbContext、コードファーストのアプローチを使用しています):

var eventsToReturn =
    ((IQueryable<Event>)
        context.Events
        .OrderByDescending(evnt => evnt.TakesPlaceOn)
        .Skip(startAt)
        .Take(numberToReturn)
    )
    .Select(evnt =>
        {
            evnt.UnmappedUsersCount = evnt.Users.Count();
            return evnt;
        }
    )
    .ToList();

UserEntity Framework は各イベントに関連付けられたすべてのエンティティを実際に取得する必要がなく、集計COUNT関数を使用して単純にユーザー数を取得できるため、これは便利です。ただし、 のIQueryableバージョンでSelectは、式ツリーに変換できるメソッド本体のないラムダ ステートメントが必要なため、機能しません。したがって、上記は機能しませんが、これは機能します。

.Select(evnt => evnt)

...そしてこれもそうです:

.Select(evnt => evnt.Users.Count())

私は問題を解決しましたが、私のやり方はかなり長引いているようです。これが私のアプローチです:

var eventsToReturnData =
    ((IQueryable<Event>)
        context.Events
        .OrderByDescending(evnt => evnt.TakesPlaceOn)
        .Skip(startAt)
        .Take(numberToReturn)
    )
    .Select(evnt =>
        new {
            Event = evnt,
            UnmappedUsersCount = evnt.Users.Count()
        }
    )
    .ToList();

var eventsToReturn = eventsToReturnData
    .Select(evntData => {
        evntData.Event.UnmappedUsersCount = evntData.UnmappedUsersCount;
        return evntData.Event;
    })
    .ToList();

だから私はメインEventオブジェクトを匿名オブジェクトに投影しint、それに追加したい小さなオブジェクトを投影してから、まったく新しいSelectonを実行していeventsToReturnDataますeventsToReturnDataIEnumerablebody)、最初のクエリから取得しEventた整数を設定してオブジェクトを微調整するだけです。UnmappedUsersCount

これを行うためのより簡単またはよりエレガントな方法はありますか? EF がイベントごとにすべてのユーザーを取得する必要がないようにしたいので、のメソッドEvent.Users.Count()によって返されるものを使用するだけではダメです。IQueryableSelect

4

1 に答える 1

1

クラスを利用しExpressionて実行時にツリーを構築することもできますが、それは非常に多くの作業とコードであるため、そのようなことを何度も行う必要がある場合にのみ正当化されます。

このパターンがコード内で 1 回だけまたはめったに発生しない場合は、これが最善の方法です。

于 2012-10-09T23:06:42.033 に答える