本当にシンプルであるべきだと思うことをしたいのですが、本当に頭痛の種であることがわかりました。Select新しいオブジェクトを作成する代わりに、投影しているIQueryableオブジェクトを「微調整」したいと思います。これが私ができるようにしたいことです(contextはDbContext、コードファーストのアプローチを使用しています):
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ますeventsToReturnData。IEnumerablebody)、最初のクエリから取得しEventた整数を設定してオブジェクトを微調整するだけです。UnmappedUsersCount
これを行うためのより簡単またはよりエレガントな方法はありますか? EF がイベントごとにすべてのユーザーを取得する必要がないようにしたいので、のメソッドEvent.Users.Count()によって返されるものを使用するだけではダメです。IQueryableSelect