有条件的if语句在Linq里面

时间:2018-02-12 20:07:47

标签: c# sql-server linq

我将以下SQL查询转换为LINQ

string qWhere;
DateTime startDate = DateTime.Parse("2018-02-01");
DateTime endDate = DateTime.Parse("2018-02-03");

if(manual == true)
{
    qWhere = " deliveryDate>=" + startDate + " and deliveryDate<=" + endDate; 
}
else
{
    qWhere = "deliveryDate>=" + DateTime.Now;
}

string sqlQuery = "select * from LoadingOrder where " + qWhere;

任何人都可以帮我翻译这个查询到LINQ,表LoadingOrder有百万行。

非常感谢

3 个答案:

答案 0 :(得分:2)

如果它只是一个条件,那么你可以有两个单独的查询而不是一个查询。我认为这更容易阅读和遵循,然后将条件放在查询本身。

var now = DateTime.Now;
if(manual)
    result = LoadingOrders.Where(s=> s.deliveryDate >= startDate && s.deliveryDate <= endDate);
else
    result = LoadingOrders.Where(s=> s.deliveryDate >= now);

假设查询有很多条件,并且“交付日期”条件是唯一更改的条件。在这种情况下,您可能不希望有两个完整版本的查询只有一个区别。在这种情况下,您可以单独创建一个条件。

要做到这一点,你需要创建一个Func<LoadingOrder, bool> - 一个带LoadingOrder并返回true或false的函数。然后,您可以指定要检查该功能的条件。

Func<LoadingOrder, bool> deliveryDateCondition;
if(manual)
    deliveryDateCondition = loadingOrder => 
        loadingOrder.deliveryDate >= startDate && loadingOrder.deliveryDate <= endDate;
else
{
    var now = DateTime.Now;
    deliveryDateCondition = loadingOrder => loadingOrder.deliveryDate >= now;
}

现在deliveryDateCondition是一个函数,它接受LoadingOrder并返回true或false。您可以将该函数添加到LINQ查询中,无论选择哪个函数,它都可以正常工作。

var result = LoadingOrders.Where(loadingOrder => deliveryDateCondition(loadingOrder) 
    && ...some other condition...
    && ...some other condition...);

答案 1 :(得分:-1)

这样的事情:

DateTime startDate = DateTime.Parse("2018-02-01");
DateTime endDate = DateTime.Parse("2018-02-03");
bool manual = ...;

loadingOrders.Where(
    o => o.DeliveryDate >= startDate &&
    o.DeliveryDate <= endDate &&
    manual ||
    o.DeliveryDate >= DateTime.Now &&
    !manual);

答案 2 :(得分:-2)

                     Random_Number   PrintOut
2018-01-05 00:00:00             13   Too hot.
2018-01-05 06:00:00              2  Too cool.
2018-01-05 12:00:00             13   Too hot.
2018-01-05 18:00:00              5    Normal.
2018-01-06 00:00:00             10    Normal.

OR

select a.peopleid
     , COUNT(*) as counted
 from booking a
 inner join people
   on a.peopleid = people.peopleid
inner join status
 on a.statusid = status.statusid
where status.status_desc = 'active'
group by a.personid