LINQ Где с И ИЛИ условие - PullRequest
       45

LINQ Где с И ИЛИ условие

25 голосов
/ 12 ноября 2009

Так что мне удалось заставить этот запрос работать

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;

Здесь я хотел бы проверить, не равны ли значения listStatus и listMerchants только null, а затем поместить их в предложение WHERE.

Как

если listMerchants равен нулю, запрос будет выглядеть как

     where listStatus.Contains(item.StatusCode) 

Я не хочу использовать условие switch или If.

Спасибо

Ответы [ 3 ]

34 голосов
/ 12 ноября 2009
from item in db.vw_Dropship_OrderItems
    where (listStatus != null ? listStatus.Contains(item.StatusCode) : true) &&
    (listMerchants != null ? listMerchants.Contains(item.MerchantId) : true)
    select item;

Может показаться странным, если оба метода listMerchants и listStatus равны нулю.

6 голосов
/ 12 ноября 2009

Ну, вам нужно где-то проверить на ноль. Вы можете сделать что-то вроде:

from item in db.vw_Dropship_OrderItems
         where (listStaus == null || listStatus.Contains(item.StatusCode)) 
            && (listMerchants == null || listMerchants.Contains(item.MerchantId))
         select item;
1 голос
/ 11 ноября 2014

Linq с или условием, используя лямбда-выражение, вы можете сделать, как показано ниже

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] + ",  ";
}
...