2

次の方法で、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

4

2 に答える 2

2

どうですか:

var userProfile = context.UserProfiles.Where(up => up.UserId == userId)
                       .OrderByDescending(up => up.IsActive).FirstOrDefault();
于 2013-02-08T12:21:46.277 に答える
1

2番目OrderByDescendingは、前のものによって行われた注文を無視します。ThenByDescending代わりに使用する必要があります:

context.UserProfiles
    .Where(up => up.UserId == userId)
    .OrderByDescending(up => up.IsActive)
    .ThenByDescending(up => up.LastUsed)
    .FirstOrDefault();
于 2013-02-08T12:37:26.310 に答える