2016-04-02 100 views
0

:Sütun değerlerine göre satırlar nasıl seçilir? Verilere şu var

 
Activity : 

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

Beklenen Sonuç:

 
Activity : 

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

o zaman mevcut sınıftan seçmenize gerek değilse ben, kullanıcı kayıtlarını seçmek çalışıyorum:

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

Hatalı Sonuç:

 
Activity : 

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

Bu işe yaramadığından veya filtrelendiğinden Hem userid hem de Orda gibi kayıtlar hem –

cevap

0

Bu durumda hangi kaydın döndüğünü umursamıyorsanız, o zaman basit bir FirstOrDefault() işlemi ilk ikisini döndürecektir. İsterseniz

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

boş olmayan KullanıcıNo ile rekor birinci döndü ve tek bir kod satırında, ilk veya borcunu bu sütun azalan göre sıralamak ve sonra alabilirsiniz:

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

EDIT: Onları 'beklenen sonuçta' olduğu gibi almak için, önce KullanıcıAdı'na göre sıralamak, sonra da etkinlikle gruplamak ve daha sonra gruptaki ilkini seçmek istiyoruz. Başlangıçta sıralanmış Çünkü hiçbiri mevcut olmadığı sürece, ilk irade her zaman doldurulan KullanıcıNo ile aktivitesi: onları doğru sonuca ulaşmak için zincirle için ihtiyacınız

var result = activity.Where(a => a.UserId != null ? a.UserId == userId : a.ClassId == classId).OrderByDescending(a => a.UserId).FirstOrDefault() 
+0

için gelir. Beklenen sonuç olarak tüm aktivitelere ihtiyacım var. –

+0

@furqanms Cevabımı bununla ilgili olarak güncelledim, lütfen beklentilerinizi karşılayıp karşılamadığını öğrenin. – gnalck

+0

Hayır, işe yaramayacak. Tüm aktivitelere ihtiyacım var ve yaptığınız koşul, Kullanıcı'nın etkinliğinin tanımlanması durumunda, etkinlikten sınıftan geri dönecektir. Bu durumda etkinliğe –

0

, daha basit bir çözüm olacaktır:

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

if(!result.Any()) 
    result = activity.where(a => a.ClassId == classId) 

İlk önce UserId'u temel alarak sonuçları alın ve geçerli bir kayıt olup olmadığını kontrol edin, eğer evet ise, bu sonuç Class Id üzerinde filtrelenir, bu nedenle mantık beklediğiniz mantık

+0

sınıfından ihtiyacım yok. Yine de kontrol etmek istersiniz, eğer UserId/ClassId geçerli bir değere sahip olsun, kod biraz değişiklik gerektiriyor, ama aynı hatlarda –

+0

beklenen sonuca ihtiyacım var tek bir sorguda belirtildiği gibi. –

+0

Sorgu aynı, mantığı daha basit hale getirmek için onu kırdım, bu doğru sonucu üretecek, tanımladığınız durumla ilgilenmek için varsayılan bir API var mı kontrol edeyim –