本当にシンプルであるべきだと思うことをしたいのですが、本当に頭痛の種であることがわかりました。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();
User
Entity 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
、それに追加したい小さなオブジェクトを投影してから、まったく新しいSelect
onを実行していeventsToReturnData
ますeventsToReturnData
。IEnumerable
body)、最初のクエリから取得しEvent
た整数を設定してオブジェクトを微調整するだけです。UnmappedUsersCount
これを行うためのより簡単またはよりエレガントな方法はありますか? EF がイベントごとにすべてのユーザーを取得する必要がないようにしたいので、のメソッドEvent.Users.Count()
によって返されるものを使用するだけではダメです。IQueryable
Select