2016-04-02 10 views
0

列の値に基づいて行を選択する方法は?私は、データ次てい

 
Activity : 

UserId Activity ClassId 
1  1   NULL   
NULL 1   1 
1  2   NULL 
NULL 2   1 
NULL 3   1 

期待される結果:

 
Activity : 

UserId Activity ClassId 
1  1   NULL   
1  2   NULL 
NULL 3   1 

それはその後、存在するクラスから選択する必要がされていない場合、私は、ユーザーレコードを選択しようとしています:

var userId = 1; 
var classId = 1; 
var result = activity.where(a=> a.UserId == userId || a.ClassId == classId).select(a=> a).ToList(); 

不適切な結果:

 
Activity : 

UserId Activity ClassId 
1  1   NULL   
NULL 1   1 
1  2   NULL 
NULL 2   1 
NULL 3   1 
+0

期待するロジックは、これはあなたが持っているので、仕事をしたりするためにフィルタリングしない、そうならば、それはClass Idの結果、他のフィルタだ、UserIdに基づいて検索結果をフェッチし、有効なレコードがありますかどうかを確認ユーザーIDとクラスIDの両方をOrとして、レコードは両方のために来る –

答えて

0

この場合、返されるレコードが気にしない場合は、単純なFirstOrDefault()を実行すると、2つのレコードの最初のレコードが返されます。

var result = activity.Where(a => a.UserId == userId || a.ClassId == classId).FirstOrDefault(); 

あなたはnull以外のユーザーIDを持つレコードを希望する場合は、最初に返され、1行のコードには、その列の降順でソートし、最初のまたはデフォルトを取得することができます。

var result = activity.Where(a => a.UserId == userId || a.ClassId == classId).OrderByDescending(a => a.UserId).FirstOrDefault() 

編集: 「期待された結果」のとおりに取得するには、まずUserId降順で並べ替えてから、アクティビティ別にグループ化し、グループ内の最初のものを選択します。

あなたは正しい結果を得るためにそれらをチェーンする必要が
var result = activity.Where(a => a.UserId != null ? a.UserId == userId : a.ClassId == classId).OrderByDescending(a => a.UserId).FirstOrDefault() 
+0

私はすべての活動が期待される結果として必要です。 –

+0

@furqanms私はそれについて説明するために私の答えを更新しました、あなたの期待に合っているかどうか見てください。 – gnalck

+0

いいえ、動作しません。私はすべてのアクティビティを必要とし、あなたが作成した条件は、アクティビティが定義されている場合にクラスからアクティビティを返します。この場合、クラスからのアクティビティは必要ありません –

0

を、簡単な解決策は次のようになります:

var result = activity.where(a => a.UserId == userId); 

if(!result.Any()) 
    result = activity.where(a => a.ClassId == classId) 
我々が最初にソートされたので、最初はいつも何も存在しない場合を除き、人口のユーザーIDでの活動になります

最初には、このようにあなたが

+0

UserId/ClassIdに有効な値があるかどうかを確認したいのですが、コードを少し修正する必要がありますが、同じ行にあることを確認したいですか? –

+0

予想される結果が必要です1つのクエリで述べたように。 –

+0

クエリは同じですが、ロジックを簡単にするために壊してしまいました。これは正しい結果を生成します。定義済みの状況を処理するデフォルトAPIが存在するかどうかをチェックします –

関連する問題