我正在使用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'在当前上下文中不存在)
我出错了什么,或者实际上不能做到这一点?
提前感谢您的帮助。
克莱尔
答案 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);