使用if语句的LINQ WHERE子句

我正在使用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’在当前上下文中不存在)

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

在此先感谢您的帮助。

克莱尔

而不是这个:

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

试试这个:

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

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

试试这个

 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或为空,则不会检查包含。

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

 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”条件。 如果你需要’OR’条件,那就更多了。 值得庆幸的是,Joe Albahari已经创建了PredicateBuilder(作为LINQKit的一部分),这对它有很大帮助。

希望这可以帮助。

..或只有一个出口点:

 var result = from a in xxxx select a; Func 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);