2017-01-31 49 views
20

if ve else bölümlerinde sorguları birleştirmenin bir yolu var mı?LINQ'da koşullu yüklemler var mı?

public List<MyClass> GetData(Category category, bool flag= true) 
{ 
    IQueryable<MyClass> result; 
    if (flag) 
    { 
     result = Session.All<MyClass>() 
        .Where(mc => mc.Col.Equals(category.ToString()) && mc.FLAG); 
    } 
    else 
    { 
     result = Session.All<MyClass>() 
        .Where(mc => mc.Col.Equals(category.ToString())); 
    } 

    return result.ToList(); 
} 

cevap

25

Elbette.

result = Session.All<MyClass>() 
       .Where(mc => mc.Col.Equals(category.ToString()) && (!flag || mc.FLAG)); 

İzin true sonuçların bir matris yaparak yeniden yazma mantığını belirleyebilirsiniz: Burada

▼ mc.FLAG ► flag 
      true  false 
true  valid valid 
false  invalid valid 

Eğer flag yanlış ise durum geçerli olduğunu görüyoruz (hem true denk) ya da mc.FLAG olduğu true.

Ayrıca, daha iyi performans gösteren yüklem olduğundan, öncelikle bayrak kontrolünü yapmayı da tavsiye ederim. Bu false ilk sonuçların ise ikinci çek engelleyebilecek:

result = Session.All<MyClass>() 
       .Where(mc => (!flag || mc.FLAG) && mc.Col.Equals(category.ToString()); 
+0

Bu düzgün. Teşekkürler! – devnull

+1

@devnull Bir şey değil. Bunun için şimdi mantık dahil. Doğru unicode karakterleri bulmakta biraz sorun vardı :) –

+1

Bu sorunun cevabını biliyorum. Sadece merak ediyorum, bunu OP'de okunabilirlik ve (marjinal) performans göz önüne alarak tercih ediyor musunuz? – Jimmy

21

yapabilirsiniz zinciri Where şartlı.

public List<MyClass> GetData(Category category, bool flag = true) 
{ 
    var result = Session.All<MyClass>() 
     .Where(mc => mc.Col.Equals(category.ToString())); 

    if (flag) { 
     result = result.Where(mc => mc.FLAG); 
    } 

    return result.ToList(); 
} 
İlgili konular