使用if语句的LINQ WHERE子句

时间:2009-09-30 10:51:44

标签: c# .net linq

我正在使用c#.net

我有两个文本框,if!empty需要成为LINQ查询中WHERE子句的一部分。

这是我的代码

var result = from a in xxxx select a;

if(!string.IsNullOrEmpty(personName))
{
    return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName)     
}
else if(!string.IsNullOrEmpty(dateFrom))
{
    return result.Where(a >= a.appStartDateTime >= dateFrom.Date)
}
else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom))
{
    return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName) &&   a.appStartDateTime >= dateFrom.Date);
}

我认为这会有效,但它不喜欢.Where和我无法访问'a',例如a.forename(名称'a'在当前上下文中不存在)

我出错了什么,或者实际上不能做到这一点?

提前感谢您的帮助。

克莱尔

4 个答案:

答案 0 :(得分:6)

而不是:

result.Where(a.forename.Contains(personName))

试试这个:

result.Where(a => a.forename.Contains(personName))

您似乎缺少Lambda运算符(=>)。

答案 1 :(得分:2)

试试这个


var result = from a in xxxx select a
    where (string.IsNullOrEmpty(personName) || a.forename.Contains(personName)
          || a.surname.Contains(personName))
          && (string.IsNullOrEmpty(dateFrom)
          || a.appStartDateTime >= DateTime.Parse(dateFrom).Date);

dateFrom似乎是一个字符串,因此您必须解析它以获取日期时间。

这个逻辑应该可行,但我还没有测试过。我错了。

如果personName不为null或为空,您似乎只关心forename或surname是否包含personName。因此,如果personName为null或为空,或者fore或sur名称包含人名,则可以重写它以返回内容。自||运算符是短路的,如果personName为null或为空,则不会检查包含。

答案 2 :(得分:2)

您还可以组合谓词并使逻辑更简短,更易于阅读:

var result = from a in xxxx select a;

if (!string.IsNullOrEmpty(personName))
    result = result.Where(a => a.forename.Contains(personName) || a.surname.Contains(personName)

if (!string.IsNullOrEmpty(dateFrom))
    result = result.Where(a >= a.appStartDateTime >= dateFrom.Date)

return result;

这种组合谓词的方法适用于“AND”条件。如果你需要'或'条件,那就更多了。值得庆幸的是,Joe Albahari已经创建了PredicateBuilder(作为LINQKit的一部分),这对此有很大帮助。

希望这有帮助。

答案 3 :(得分:1)

..或只有一个退出点:

var result = from a in xxxx select a;

Func<string, bool> func = null;

if(!string.IsNullOrEmpty(personName))
{
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName)};    
}

else if(!string.IsNullOrEmpty(dateFrom))
{
func = (a) => {a.appStartDateTime >= dateFrom.Date};
}

else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom))
{
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName) &&  a.appStartDateTime >= dateFrom.Date;};
}

return result.Where(func);