2009-11-12 10 views
22

So habe ich es geschafft, diese Abfrage erhalten arbeitenLINQ Wo mit AND OR Bedingung

List<string> listStatus = new List<string>() ; 
listStatus.add("Text1"); 

List<string> listMerchants = new List<string>() ; 
listMerchants.add("Text2"); 


from item in db.vw_Dropship_OrderItems 
      where listStatus.Contains(item.StatusCode) 
         && listMerchants.Contains(item.MerchantId) 
      select item; 

Hier würde ich prüfen möchte, ob listStatus und listMerchants nicht null sind nur setzen sie dann in WHERE-Klausel.

Wie

wenn listMerchants null ist, dann wird Abfrage wie sein

 where listStatus.Contains(item.StatusCode) 

I Schalter nicht verwenden wollen oder wenn Bedingung.

Dank

Antwort

27
from item in db.vw_Dropship_OrderItems 
    where (listStatus != null ? listStatus.Contains(item.StatusCode) : true) && 
    (listMerchants != null ? listMerchants.Contains(item.MerchantId) : true) 
    select item; 

Könnte seltsame Verhalten geben, wenn beide listMerchants und listStatus beide null sind.

+0

oops tun können; habe es vor mir –

+0

Ich musste listStatus.Count == 0 statt null – Zeus

5

Nun, Sie gehen zu müssen für null irgendwo überprüfen. Man könnte so etwas wie tun: durch Verwendung von Lambda Ausdruck

from item in db.vw_Dropship_OrderItems 
     where (listStaus == null || listStatus.Contains(item.StatusCode)) 
      && (listMerchants == null || listMerchants.Contains(item.MerchantId)) 
     select item; 
0

Linq With Or Zustand Sie unten als

DataTable dtEmp = new DataTable(); 

dtEmp.Columns.Add("EmpID", typeof(int)); 
dtEmp.Columns.Add("EmpName", typeof(string)); 
dtEmp.Columns.Add("Sal", typeof(decimal)); 
dtEmp.Columns.Add("JoinDate", typeof(DateTime)); 
dtEmp.Columns.Add("DeptNo", typeof(int)); 

dtEmp.Rows.Add(1, "Rihan", 10000, new DateTime(2001, 2, 1), 10); 
dtEmp.Rows.Add(2, "Shafi", 20000, new DateTime(2000, 3, 1), 10); 
dtEmp.Rows.Add(3, "Ajaml", 25000, new DateTime(2010, 6, 1), 10); 
dtEmp.Rows.Add(4, "Rasool", 45000, new DateTime(2003, 8, 1), 20); 
dtEmp.Rows.Add(5, "Masthan", 22000, new DateTime(2001, 3, 1), 20); 


var res2 = dtEmp.AsEnumerable().Where(emp => emp.Field<int>("EmpID") 
      == 1 || emp.Field<int>("EmpID") == 2); 

foreach (DataRow row in res2) 
{ 
    Label2.Text += "Emplyee ID: " + row[0] + " & Emplyee Name: " + row[1] + ", "; 
}