次の方法で、EntityFramework5を使用してデータベースにクエリを実行しようとしています。
userProfile = context.UserProfiles.SingleOrDefault(up => up.UserId == userId && up.IsActive);
これで、複数のユーザープロファイルが存在する場合(のためSingleOrDefault
)、これは明らかに例外をスローします。
現在のユーザー()からアクティブなユーザープロファイルを取得するように、またはアクティブなユーザープロファイルがない場合に最初のユーザープロファイルを取得するようにクエリを作成するにはどうすればよいですか?up.UserId == userId
私は2つのクエリでこれを行う方法を完全に知っていますが、それはオーバーヘッドが大きすぎると思います。これは1つのクエリで可能になるはずです。
userProfile = context.UserProfiles.Single(up => up.UserId == userId && up.IsActive); // throws exception when not exactly one
if (userProfile == null)
{
userProfile = context.UserProfiles.FirstOrDefault(up => up.UserId == userId);
}
編集:
私は今これをパラメータとして使用しており、IsActive
プロパティ
で問題なく動作します。context.UserProfiles.Where(up => up.UserId == userId).OrderByDescending(up => up.IsActive).FirstOrDefault();
IsActive == true
行がない場合は、LastUsed
日付順に並べて、最近使用されているものを選択します。
context.UserProfiles.Where(up => up.UserId == userId).OrderByDescending(up => up.IsActive).OrderByDescending(up => up.LastUsed).FirstOrDefault();
悲しいことに、これは、次の行がある場合でも、常に最新のものを返します。IsActive == true